2017-01-07 91 views
1

我在Linux上有一個250GB的壓縮文件,我想將它拆分爲250個1GB文件,並在運行時壓縮生成的部分文件(只要一個文件被生成,它應該被壓縮)。 我試圖用這個 -將一個.gz文件拆分爲多個1GB壓縮(.gz)文件

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

但這產生未壓縮的文件有很強的針對性。我修改它看起來像這樣,但得到了一個錯誤:

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 

我也試過這一點,並沒有拋出任何錯誤,但並未只要它們生成壓縮零件文件。我假設這將在整個分割完成時壓縮每個文件(或者它可以打包所有部分文件並在分割完成後創建單個gz文件,我不確定)。

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

我讀here有一個過濾器的選擇,但我的分裂版本(GNU的coreutils)8.4,因此過濾器不支持。

$ split --version 
split (GNU coreutils) 8.4 

請告知合適的方式來實現這一點,優選地使用一個襯裏代碼(如果可能的話)或殼(慶典/ KSH)腳本也將工作。

+0

我建議在某些腳本語言中編寫自己的「split with gzip」變體。因爲否則,您將不得不通過該250 GB文件多次讀取(首先確定它的大小,然後在循環中始終採用一個拼接並對其進行gzip) – MacHala

+0

這些部件獨立可解壓縮的重要性如何?如果你只是運行'split -b 1G file.gz',你最終會得到250個文件部分,你可以把它們放在一起然後解壓縮。 –

回答

1

這絕對是不理想的,但我試圖把它寫在bash只是爲了好玩(我沒有實際測試過所以有可能會出現一些小錯誤)

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

分離,支持過濾命令。使用這個:

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

正如我在我的問題中已經提到的,我的split版本不支持--filter選項。 –