将.gz文件拆分为多个1GB压缩(.gz)文件

时间:2017-01-07 16:55:48

标签: linux split

我在Linux上有一个250GB的gzip压缩文件,我希望将它分成250个1GB文件并动态压缩生成的部分文件(一旦生成一个文件,就应该压缩它)。 我试过用这个 -

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有一个过滤器选项,但我的split版本是(GNU coreutils)8.4,因此不支持过滤器。

$ split --version
split (GNU coreutils) 8.4

请告知一种合适的方法来实现这一目标,最好使用单行代码(如果可能)或shell(bash / ksh)脚本也可以。

2 个答案:

答案 0 :(得分:2)

split支持过滤命令。使用此:

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

答案 1 :(得分: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