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
?
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
?
Risposte:
Bene, supponendo che tu abbia stat
e bash
, puoi ottenere la dimensione del file con:
stat -c %s your_file
Se si desidera estrarre gli ultimi $amount
byte 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
-c
opzione per head
?
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.