Usa `dd` per tagliare la parte finale del file


18

Probabilmente c'è un semplice trucco per farlo, ma non riesco a capire dalla pagina man.

Come posso tagliare l'ultimo 1 MB dal file con dimensioni indeterminate, ad esempio, usando dd?


1
Vuoi una copia di quel file, ad eccezione degli ultimi 1 MB o vuoi che gli ultimi MB vengano copiati in un altro file?
Mat

Voglio l'ultimo 1 MB
zetah,

Risposte:


29

Bene, supponendo che tu abbia state bash, puoi ottenere la dimensione del file con:

stat -c %s your_file

Se si desidera estrarre gli ultimi $amountbyte per quel file con dd, è possibile:

dd if=your_file of=extracted_part \
   bs=1 count=$amount \
   skip=$(( $(stat -c %s your_file) - $amount ))

Ma l'approccio più sano sarebbe usare tail:

tail -c $(( 1024*1024 )) your_file > target_file

Nessuna -copzione per head?
ADTC

Penso che intendesse + $ ((1024 * 1024)): -c, --bytes = K emette gli ultimi K byte; in alternativa, utilizzare -c + K per generare byte a partire dal Kth di ciascun file
Vanuan

5
dd --help
Utilizzo: dd [OPERAND] ...
  oppure: dd OPTION
Copia un file, convertendolo e formattandolo in base agli operandi.

  bs = BYTES legge e scrive byte BYTES alla volta (vedi anche ibs =, obs =)
  cbs = BYTES converte i byte BYTES alla volta
  conv = CONVS converte il file secondo l'elenco dei simboli separato da virgola
  count = BLOCKS copia solo i blocchi di input BLOCKS
  ibs = BYTES legge i byte BYTES alla volta (impostazione predefinita: 512)
  if = FILE letto da FILE anziché da stdin
  iflag = FLAGS letti secondo l'elenco dei simboli separati da virgola
  obs = BYTES scrive byte BYTES alla volta (impostazione predefinita: 512)
  of = FILE scrive su FILE anziché su stdout
  oflag = FLAGS scrive secondo l'elenco dei simboli separato da virgole
  seek = BLOCKS salta BLOCKS blocchi di dimensioni obsolete all'inizio dell'output
  skip = BLOCKS salta BLOCKS blocchi di dimensioni ibs all'inizio dell'ingresso
  status = noxfer sopprime le statistiche di trasferimento

BLOCCHI e BYTES possono essere seguiti dai seguenti suffissi moltiplicativi:
c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M
GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 e così via per T, P, E, Z, Y.

Se la dimensione del file è esattamente 10 MB, 1024 * 10 10240 K Questo lascerà gli ultimi 1024 KB. Dovresti specificare la dimensione del blocco con cui stai lavorando usando le opzioni ibs e 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

Puoi anche saltare i primi 1 MB di un file, usando l'opzione skip per leggere fino alla fine del file saltando i primi 1 MB.

dd if=/10/MB/file of=/9/MB/file skip=1M ibs=1M obs=1M

Usando l'opzione seek puoi scrivere a in una posizione specifica nel tuo file di output. Supponi di voler conservare i primi 1 MB e sovrascrivere gli ultimi 8 MB.

dd if=/10/MB/file of=/9/MB/file skip=1M seek=1M count=8M ibs=1M obs=1M

Probabilmente è necessario ottenere alcuni dettagli sulla dimensione del file per assicurarsi di ottenere la giusta quantità di dati dentro e fuori.

ls -s --block-size 1K ./my/10MB/file
uomo ls

       --block-size = SIZE
              usa i blocchi SIZE-byte. Vedi formato FORMATO di seguito

       -s, --size
              stampa la dimensione allocata di ciascun file, in blocchi

       SIZE può essere (o può essere un numero intero eventualmente seguito da) uno dei seguenti
       lowing: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024 e così via per G, T,
       P, E, Z, Y.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.