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 G
Suffix ersetzt werden kann, um GB
die 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: dd
Kann an Ort und Stelle abgeschnitten werden.
Antwort2
Um eine Datei auf 1 Gigabyte zu kürzen, verwenden Sie den truncate
folgenden 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 truncate
istHierund 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 dd
können Sie auch eine direkte Kürzung durchführen.
dd
Das 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 dd
in 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 dd
kennt .k
b
w
Antwort4
Sie können den Befehl verwenden split
.
split -C 1G <filename>
Weitere Einzelheiten finden Sie hierStackoverflow-Antwort