Verwenden Sie `dd`, um das Dateiende auszuschneiden

18

Es gibt wahrscheinlich einen einfachen Trick, um dies zu tun, aber ich kann nicht aus der Manpage herausfinden.

Wie schneide ich die letzten 1 MB aus einer Datei mit einer unbestimmten Größe, zum Beispiel mit dd?

Zetah
quelle
1
Sie möchten eine Kopie dieser Datei, mit Ausnahme der letzten 1 MB, oder die letzte MB, die in eine andere Datei kopiert werden soll?
Mat
Ich möchte die letzten 1 MB
Zetah

Antworten:

29

Nun, vorausgesetzt, Sie haben statund bash, können Sie die Dateigröße mit erhalten:

stat -c %s your_file

Wenn Sie die letzten $amountBytes für diese Datei mit extrahieren möchten dd, können Sie:

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

Aber der vernünftigere Ansatz wäre tail:

tail -c $(( 1024*1024 )) your_file > target_file
Matte
quelle
Keine -cOption für head?
ADTC
Ich denke, er meinte + $ ((1024 * 1024)): -c, --bytes = K gibt die letzten K Bytes aus; Alternativ können Sie -c + K verwenden, um Bytes auszugeben, beginnend mit Kth jeder Datei
Vanuan,
5
dd --help
Verwendung: dd [OPERAND] ...
  oder: dd OPTION
Kopieren Sie eine Datei, konvertieren und formatieren Sie sie entsprechend den Operanden.

  bs = BYTES Lesen und Schreiben von BYTES-Bytes gleichzeitig (siehe auch ibs =, obs =)
  cbs = BYTES konvertiert BYTES-Bytes gleichzeitig
  conv = CONVS konvertiert die Datei gemäß der durch Kommas getrennten Symbolliste
  count = BLOCKS kopiert nur die BLOCKS-Eingabeblöcke
  ibs = BYTES liest BYTES-Bytes gleichzeitig (Standard: 512)
  if = FILE liest aus FILE statt aus stdin
  iflag = FLAGS laut kommagetrennter Symbolliste
  obs = BYTES schreibt BYTES Bytes gleichzeitig (Standard: 512)
  of = FILE schreibe nach FILE anstatt nach stdout
  oflag = FLAGS schreiben gemäß der durch Kommas getrennten Symbolliste
  seek = BLOCKS überspringt BLOCKS-Blöcke in Übergröße zu Beginn der Ausgabe
  überspringen = BLÖCKE überspringen BLÖCKE Blöcke der Größe ibs zu Beginn der Eingabe
  status = noxfer unterdrücke Übertragungsstatistik

Auf BLOCKS und BYTES können die folgenden multiplikativen Suffixe folgen:
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 usw. für T, P, E, Z, Y.

Wenn die Dateigröße genau 10 MB beträgt, 1024 * 10 10240 KB, verbleiben die letzten 1024 KB. Sie sollten die Blockgröße angeben, mit der Sie arbeiten, indem Sie die Optionen ibs und obs verwenden.

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

Sie können auch die ersten 1 MB einer Datei überspringen, indem Sie die Option zum Überspringen verwenden, um zum Ende der Datei zu gelangen und die ersten 1 MB zu überspringen.

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

Mit der Suchoption können Sie eine an eine bestimmte Stelle in Ihrer Ausgabedatei schreiben. Angenommen, Sie möchten die ersten 1 MB behalten und die letzten 8 MB überschreiben.

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

Möglicherweise müssen Sie einige Details zu Ihrer Dateigröße abrufen, um sicherzustellen, dass Sie die richtige Datenmenge ein- und ausgeben.

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

       --block-size = GRÖSSE
              Verwenden Sie SIZE-Byte-Blöcke. Siehe Format GRÖSSE unten

       -s, --size
              Gibt die zugewiesene Größe jeder Datei in Blöcken aus

       GRÖSSE kann eine der folgenden sein (oder kann eine ganze Zahl sein, auf die optional folgt):
       unten: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024 usw. für G, T,
       P, E, Z, Y.
Nelaaro
quelle