Aujourd'hui, je devais supprimer les 1131 premiers octets d'un fichier texte / binaire mixte de 800 Mo, un cliché de sous-version filtré que je cherchais dans un nouveau référentiel. Quelle est la meilleure façon de faire cela?
Pour commencer j'ai essayé
dd bs=1 skip=1131 if=filtered.dump of=trimmed.dump
mais après le saut, cela copie le reste du fichier un octet à la fois, c’est-à-dire très lentement. À la fin, j’ai trouvé que j’avais besoin de 405 octets pour arrondir à trois blocs de 512 que je pouvais sauter.
dd if=/dev/zero of=405zeros bs=1 count=405
cat 405zeros filtered.dump | dd bs=512 skip=3 of=trimmed.dump
qui a terminé assez rapidement mais il devait y avoir une manière plus simple / meilleure? Y a-t-il un autre outil que j'ai oublié? Merci!
dd
est le bon outil pour le travail - on dirait que vous avez trouvé une solution élégante et élégante à votre problème.Réponses:
Vous pouvez changer les options bs et skip:
De cette façon, l'opération peut bénéficier d'un bloc plus important.
Sinon, vous pouvez essayer avec tail (bien que ce ne soit pas sûr de l'utiliser avec des fichiers binaires):
Enfin, vous pouvez utiliser 3 instances de dd pour écrire quelque chose comme ceci:
où le premier dd imprime sa sortie standard filter.dump; le second lit simplement 1131 octets et les jette; ensuite, le dernier lit à partir de son entrée standard les octets restants de filter.dump et les écrit dans trimmed.dump.
la source
bs=1131 skip=1
: - /Vous ne savez pas quand a
skip_bytes
été ajouté, mais pour ignorer les 11 premiers octets, vous avez:Où
iflag=skip_bytes
indique à dd d'interpréter la valeur de l'skip
option sous forme d'octets au lieu de blocs, ce qui simplifie les choses.la source
iflag=skip_bytes skip=1234 bs=1M
Vous pouvez utiliser un sous-shell et deux
dd
appels comme ceci:la source
Si le système de fichiers et le noyau Linux le supportent, vous pouvez essayer
fallocate
si vous souhaitez apporter les modifications à la place: dans le meilleur des cas, il n'y a pas du tout d'entrées / sorties de données:où
<magic>
dépend du système de fichiers, de la version de Linux et du type de fichier (FALLOC_FL_COLLAPSE_RANGE
ouFALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE
peut être utilisé en interne ).la source
Vous devriez utiliser
count=0
- c'est aussi simplelseek()
que possible.Comme ça:
dd
Lelseek()
descripteur de fichier d’entrée contiendra un décalage de 1131 octets, puiscat
copiera simplement le reste à produire.la source
Un autre moyen de supprimer les octets de début d'un fichier (sans utiliser
dd
du tout) consiste à utiliserxxd
etsed
outail
respectivement.la source
@maxschlepzig demande un liner en ligne. En voici un en perl. Il faut 2 arguments: De octet et de longueur. Le fichier d'entrée doit être donné par '<' et le résultat sera sur stdout:
Si la longueur est plus grande que le fichier, le reste du fichier sera copié.
Sur mon système, cela fournit 3,5 Go / s.
la source
dd
cela ne garantit pas une lecture complète. Essayez: oui | dd bs = 1024k count = 10 | wc unix.stackexchange.com/questions/17295/…