2017-01-07 7 views
1

Ich habe eine 250GB große Datei unter Linux gezippt und möchte sie in 250 1GB Dateien aufteilen und die generierten Teildateien sofort komprimieren (sobald eine Datei vorhanden ist erzeugt wird, sollte es komprimiert werden). Ich habe versucht, dies mit -Eine .gz Datei in mehrere 1GB komprimierte (.gz) Dateien aufteilen

zcat file.gz | split -b 1G – file.gz.part 

Aber diese unkomprimierten Datei erzeugt und das zu Recht. Ich änderte es so aussehen, bekam aber einen Fehler:

zcat file.gz | split -b 1G - file.gz.part | gzip 
gzip: compressed data not written to a terminal. Use -f to force compression. 
For help, type: gzip -h 

ich das auch versucht, und es hat keinen Fehler werfen, aber nicht die Teiledatei komprimieren, sobald sie erzeugt werden. Ich nehme an, dass dies jede Datei komprimieren wird, wenn die gesamte Aufteilung abgeschlossen ist (oder es kann alle Teildateien packen und eine einzelne gz-Datei erstellen, sobald die Aufteilung abgeschlossen ist, bin ich mir nicht sicher).

zcat file.gz | split -b 1G - file.gz.part && gzip 

Ich las here, dass es eine Filteroption ist, aber meine Version von Split ist (GNU coreutils) 8,4, damit die Filter nicht unterstützt wird.

$ split --version 
split (GNU coreutils) 8.4 

Bitte geben Sie einen geeigneten Weg, um dies zu erreichen, vorzugsweise einen Einzeiler Code (falls möglich) oder eine Shell (bash/KSH) Skript wird auch funktionieren.

+0

Ich würde empfehlen, Ihre eigene "Split mit Gzip" Variante in einer Skriptsprache zu schreiben. Weil sonst müssen Sie diese 250 GB-Datei viele Male lesen (zuerst bestimmen Sie ihre Größe und dann in der Schleife immer einen Spleiß und gzip es) – MacHala

+0

Wie wichtig ist es, dass die Teile unabhängig dekomprimierbar sein können? Wenn Sie einfach 'split -b 1G file.gz' ausführen, erhalten Sie 250 Dateiparts, die Sie zusammen katapultieren und dann dekomprimieren können. –

Antwort

1

es ist definitiv nicht optimal, aber ich versuchte es in bash zu schreiben nur zum Spaß (ich habe nicht wirklich getestet, so dass es einige kleinere Fehler sein kann)

GB_IN_BLOCKS=`expr 2048 \* 1024` 
GB=`expr $GB_IN_BLOCKS \* 512` 

COMPLETE_SIZE=`zcat asdf.gz | wc -c` 

PARTS=`expr $COMPLETE_SIZE \/ $GB` 

for i in `seq 0 $PARTS` 
do 
    zcat asdf.gz | dd skip=`expr $i \* GB_IN_BLOCKS` count=$GB_IN_BLOCKS | gzip > asdf.gz.part$i 
done 
0

Spaltfilter Befehle unterstützt. Verwenden Sie diese:

zcat file.gz | split - -b 1G --filter='gzip > $FILE.gz' file.part. 
+0

Wie ich bereits in meiner Frage erwähnt habe, unterstützt meine Version von Split nicht --filter Option. –

Verwandte Themen