Utilisez `dd` pour couper la fin de fichier


18

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?


1
Vous voulez une copie de ce fichier, à l'exception du dernier 1 Mo, ou voulez-vous que le dernier Mo soit copié dans un autre fichier?
Mat

Je veux le dernier 1 Mo
zetah

Réponses:


29

Eh bien, en supposant que vous ayez statet bash, vous pouvez obtenir la taille du fichier avec:

stat -c %s your_file

Si vous souhaitez extraire les derniers $amountoctets 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

Aucune -coption pour head?
ADTC

Je pense qu'il voulait dire + $ ((1024 * 1024)): -c, --bytes = K sort les derniers K octets; Alternativement, utilisez -c + K pour sortir les octets en commençant par le Kème de chaque fichier
Vanuan

5
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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.