Il y a probablement une astuce simple pour ce faire, mais je ne peux pas comprendre la page de manuel.
Comment puis-je couper le dernier 1 Mo d'un fichier de taille indéterminée, par exemple, en utilisant dd
?
Il y a probablement une astuce simple pour ce faire, mais je ne peux pas comprendre la page de manuel.
Comment puis-je couper le dernier 1 Mo d'un fichier de taille indéterminée, par exemple, en utilisant dd
?
Réponses:
Eh bien, en supposant que vous ayez stat
et bash
, vous pouvez obtenir la taille du fichier avec:
stat -c %s your_file
Si vous souhaitez extraire les derniers $amount
octets de ce fichier avec dd
, vous pouvez:
dd if=your_file of=extracted_part \
bs=1 count=$amount \
skip=$(( $(stat -c %s your_file) - $amount ))
Mais l'approche plus saine consisterait à utiliser tail
:
tail -c $(( 1024*1024 )) your_file > target_file
-c
option pour head
?
dd --help Utilisation: dd [OPERAND] ... ou: dd OPTION Copiez un fichier, convertissez et formatez selon les opérandes. bs = BYTES lit et écrit des octets BYTES à la fois (voir aussi ibs =, obs =) cbs = BYTES convertit BYTES octets à la fois conv = CONVS convertir le fichier selon la liste des symboles séparés par des virgules count = BLOCKS copier uniquement les blocs d'entrée BLOCKS ibs = BYTES lire BYTES octets à la fois (par défaut: 512) if = FILE lu depuis FILE au lieu de stdin iflag = FLAGS lu selon la liste des symboles séparés par des virgules obs = BYTES écrire BYTES octets à la fois (par défaut: 512) of = FILE écrire dans FILE au lieu de stdout oflag = FLAGS écrit selon la liste des symboles séparés par des virgules cherche = BLOCS ignore les blocs de taille obsolète BLOCKS au début de la sortie skip = BLOCKS skip BLOCKS blocs de taille ibs au début de l'entrée status = noxfer supprime les statistiques de transfert BLOCKS et BYTES peuvent être suivis des suffixes multiplicatifs suivants: c = 1, w = 2, b = 512, kB = 1000, K = 1024, Mo = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, etc. pour T, P, E, Z, Y.
Si la taille du fichier est exactement de 10 Mo, 1024 * 10 10240 Ko Cela laissera le dernier 1024 Ko. Vous devez spécifier la taille de bloc avec laquelle vous travaillez à l'aide des options ibs et obs.
1M = 1024K
1024*9 = 9216
dd if=/10/MB/file of=/9/MB/file count=9216K ibs=1K obs=1K
dd if=/10/MB/file of=/9/MB/file count=9M ibs=1M obs=1M
Vous pouvez également ignorer le premier 1 Mo d'un fichier, en utilisant l'option de saut pour lire jusqu'à la fin du fichier en ignorant le premier 1 Mo.
dd if=/10/MB/file of=/9/MB/file skip=1M ibs=1M obs=1M
En utilisant l'option de recherche, vous pouvez écrire un à un endroit spécifique dans votre fichier de sortie. Supposons que vous souhaitiez conserver le premier 1 Mo et écraser les 8 derniers Mo.
dd if=/10/MB/file of=/9/MB/file skip=1M seek=1M count=8M ibs=1M obs=1M
Vous devrez probablement obtenir des détails sur la taille de votre fichier pour vous assurer d'obtenir et de récupérer la bonne quantité de données.
ls -s --block-size 1K ./my/10MB/file
homme ls --block-size = TAILLE utilisez des blocs SIZE-byte. Voir le format TAILLE ci-dessous -s, --taille imprimer la taille allouée de chaque fichier, en blocs SIZE peut être (ou peut être un entier éventuellement suivi de) l'un des suivants lowing: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024, etc. pour G, T, P, E, Z, Y.