Ich habe eine 150-GB-XML-Datei, die ich auf ca. 1 GB kürzen (dh abschneiden) möchte - kann ich einen einfachen (bash oder ähnlichen) Befehl verwenden oder muss ich die programmatische Route wählen (in vi oder emacs bearbeiten)? ist ein Albtraum auch auf großen Eisensystemen)?
(Ich bin nicht besonders besorgt über den Verlust von Informationen, ich möchte eine kürzere Datei, damit ich ein Stück Software darauf testen und nicht viele Stunden auf die Antwort warten kann. Mit einer kürzeren Datei kann ich das tun.)
bash
unix
file-management
adrianmcmenamin
quelle
quelle
Antworten:
Angenommen, Sie möchten die ersten 1 GB der 150 GB-Datei abschneiden und extrahieren:
Mit
head
:head -c 1G infile > outfile
Beachten Sie, dass das
G
Suffix ersetzt werden kannGB
, um 1000 anstelle von 1024 auszurichten.Oder mit
dd
:dd if=infile of=outfile bs=1M count=1024
Oder wie in Wumpus Q. Wumbleys Antwort,
dd
kann an Ort und Stelle abgeschnitten werden.quelle
Verwenden Sie den folgenden
truncate
Befehl , um eine Datei auf 1 GB zu kürzen :Das Ergebnis der Kürzung wird wahrscheinlich keine gültige XML-Datei sein, aber ich habe festgestellt, dass Sie das verstehen.
Dokumentation für die GNU-Version von
truncate
ist hier und Dokumentation für die BSD-Version ist hierquelle
Wo immer möglich, würde ich den
truncate
Befehl wie in John1024s Antwort verwenden. Es ist jedoch kein Standard-Unix-Befehl, sodass Sie möglicherweise eines Tages nicht in der Lage sind, ihn zu verwenden. In diesem Falldd
kann auch eine direkte Kürzung durchgeführt werden.dd
Standardmäßig wird die Ausgabedatei an der Stelle abgeschnitten, an der der Kopiervorgang endet. Geben Sie ihr also eine Eingabedatei mit der Länge 0 und teilen Sie ihr mit, dass sie an der gewünschten Stelle mit dem Schreiben beginnen soll:(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 vermied bs = 1m , weil dies eine „Portabilität“ Antwort ist, und klassische
dd
kennt nur Suffixek
,b
undw
.quelle
bs
Zahl multiplizierteseek
Zahl die Anzahl der zu speichernden Bytes ist. Zwei beliebige Zahlen, die diese Bedingung erfüllen, sollten funktionieren. zBbs=1073741824 seek=1
oderbs=1 seek=1073741824
. Oder, da diebs
Standardeinstellung 512 ist,seek=2097152
sollte auch alleine funktionieren. Und Sie können Notation wie verwenden1M
,1K
,1G
und2M
.Ich bin nicht ganz sicher, was Sie fragen. Möchten Sie nur die anderen 149 GB loswerden oder versuchen Sie, 150 GB auf 1 GB zu komprimieren? Unabhängig davon kann dies eine nützliche Methode sein, um dies zu erreichen.
Der
split
Befehl kann jede Datei in mehrere Teile aufteilen. Siehe Mann gespalten . Mit der-b
Option können Sie die Größe der Datei-Chunks festlegen, in die Sie sie aufteilen möchten . Zum Beispiel:$ split -b 1GB myfile.xml
Ohne weitere Optionen sollten dabei mehrere Dateien im aktuellen Verzeichnis erstellt werden, die mit dem Buchstaben beginnen
x
. Wenn Sie die Namen der aufgeteilten Dateien anpassen möchten, lesen Sie die Manpage.Um die Datei wieder zusammenzusetzen, verwenden Sie einfach
cat * > re-assembled.xml
.Beispiel:
quelle
Sie können den
split
Befehl verwenden.Weitere Informationen finden Sie in dieser Stackoverflow-Antwort
quelle
Am Ende habe ich nur
sed
eine beliebige Anzahl von Zeilen extrahiert:quelle
sed 1000000q
(und visuell etwas kompakter).