J'ai besoin de concaténer des morceaux de deux fichiers:
si j'avais besoin de concaténer des fichiers entiers, je pourrais simplement faire
cat file1 file2 > output
Mais je dois ignorer le premier 1 Mo du premier fichier et je ne veux que 10 Mo du deuxième fichier. Cela ressemble à un travail pour dd
.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
Est-il possible de le faire en une seule étape? c'est-à-dire sans avoir besoin de sauvegarder les résultats intermédiaires? Puis-je utiliser plusieurs fichiers d'entrée dans dd
?
oflag=append conv=notrunc
), donc les systèmes de fichiers qui font une allocation retardée (comme XFS) sont moins susceptibles de décider que le fichier est terminé en cours d'écriture alors qu'il reste encore du chemin à parcourir.dd
qu'on ne le lui demande passync
, l'allocation retardée ne devrait pas démarrer immédiatement de toute façon (sauf si la mémoire est insuffisante, auquel cas aucune des méthodes ne retardera l'allocation).bash
etmksh
qui n'optimisent pas le fork de la dernière commande d'un sous-shell, vous pouvez le rendre légèrement plus efficace en remplaçant le sous-shell par un groupe de commandes. Pour les autres shells, cela ne devrait pas avoir d'importance, et l'approche des sous-shells pourrait même être légèrement plus efficace car le shell n'a pas besoin de sauvegarder et de restaurer stdout.Je ne pense pas que vous puissiez facilement lire plusieurs fichiers en une seule
dd
invocation, mais vous pouvez ajouter pour créer le fichier de sortie en plusieurs étapes:Vous devez spécifier les deux
conv=notrunc
etoflag=append
. Le premier évite de tronquer la sortie, le second commence à écrire à partir de la fin du fichier existant.la source
Gardez à l' esprit que
dd
est une interface première auread()
,write()
etlseek()
appel système. Vous ne pouvez l'utiliser que de manière fiable pour extraire des morceaux de données de fichiers normaux, bloquer des périphériques et certains périphériques de caractères (comme/dev/urandom
), c'est-à-dire des fichiers pour lesquels ilread(buf, size)
est garanti de revenirsize
tant que la fin du fichier n'est pas atteinte.Pour les tuyaux, les sockets et la plupart des périphériques de caractères (comme ttys), vous n'avez aucune garantie à moins que vous n'utilisiez la
read()
taille 1 ou que vous utilisiez l'dd
extension GNUiflag=fullblock
.Alors soit:
Ou:
Ou avec des coques avec support intégré pour un opérateur de recherche comme
ksh93
:Ou
zsh
(en supposant que votrehead
supporte l'-c
option ici):la source
$IFS
. C'est indépendamment du contenu de la variable / expansion. Voir aussi Conséquences pour la sécurité d'oublier de citer une variable dans des shells bash / POSIXgdd
place dedd
. Est-ce une faute de frappe, ou est-ce intentionnel?Avec un isme bash , et une "utilisation inutile de cat " fonctionnellement, mais plus proche de la syntaxe que l'OP utilise:
(Cela étant dit, la réponse de Stephen Kitt semble être la méthode la plus efficace possible.)
la source
<(...)
est un kshisme qui a copiézsh
etbash
copié.