我在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)脚本也可以。
答案 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