Wie kann ich eine Datei über die Befehlszeile kürzen?

Wie kann ich eine Datei über die Befehlszeile kürzen?

Ich habe eine 150 GB große XML-Datei, die ich auf etwa 1 GB kürzen (also abschneiden) möchte. Gibt es einen einfachen Befehl (Bash oder ähnlich), den ich verwenden kann, oder muss ich den programmgesteuerten Weg gehen (die Bearbeitung in vi oder emacs ist selbst auf Hochleistungssystemen ein Albtraum)?

(Der Informationsverlust macht mir keine besonderen Sorgen, ich möchte eine kürzere Datei, damit ich eine Software darauf testen kann und nicht viele Stunden auf die Antwort warten muss; eine kürzere Datei ermöglicht mir das.)

Antwort1

Angenommen, Sie möchten das erste GB der 150 GB großen Datei abschneiden und extrahieren:

Mit head:

head -c 1G infile > outfile

Beachten Sie, dass das GSuffix ersetzt werden kann, um GBdie Ausrichtung auf 1000 statt 1024 vorzunehmen.

Oder mit dd:

dd if=infile of=outfile bs=1M count=1024

Oder wie in der Antwort von Wumpus Q. Wumbley: ddKann an Ort und Stelle abgeschnitten werden.

Antwort2

Um eine Datei auf 1 Gigabyte zu kürzen, verwenden Sie den truncatefolgenden Befehl:

truncate -s 1G file.xml

Das Ergebnis der Kürzung wird wahrscheinlich keine gültige XML-Datei sein, aber ich gehe davon aus, dass Sie das verstehen.

Die Dokumentation für die GNU-Version truncateistHierund die Dokumentation für die BSD-Version istHier

Antwort3

Wenn möglich, würde ich den Befehl wie in der Antwort von John1024 verwenden truncate. Es handelt sich jedoch nicht um einen Standard-Unix-Befehl, sodass Sie ihn möglicherweise eines Tages nicht mehr verwenden können. In diesem Fall ddkönnen Sie auch eine direkte Kürzung durchführen.

ddDas Standardverhalten von besteht darin, die Ausgabedatei an der Stelle abzuschneiden, an der der Kopiervorgang endet. Sie können ihm also einfach eine Eingabedatei mit der Länge 0 geben und ihm sagen, dass es an der gewünschten Abschneidestelle mit dem Schreiben beginnen soll:

dd if=/dev/null of=filename bs=1048576 seek=1024

(Dies ist nicht dasselbe wie das Kopieren und Abschneiden ddin der Antwort von multithr3at3d.)

Beachten Sie, dass ich 1048576 und 1024 verwendet habe, da 1048576*1024 die gewünschte Größe ist. Ich habe bs=1m vermieden, da dies eine „Portabilitäts“-Antwort ist und Classic nur die Suffixe , , und ddkennt .kbw

Antwort4

Sie können den Befehl verwenden split.

split -C 1G <filename>

Weitere Einzelheiten finden Sie hierStackoverflow-Antwort

verwandte Informationen