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?

zetah
la source
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
Tapis
la source
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.
nelaaro
la source