将一个 .gz 文件拆分成多个1GB的压缩(.gz)文件

5

我在Linux上有一个250GB的gzipped文件,想把它分成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

我在这里读到,有一个筛选器选项,但我的split版本是(GNU coreutils)8.4,因此不支持该筛选器。

$ split --version
split (GNU coreutils) 8.4

请建议一个适合的方式来实现这个目标,最好使用一行代码(如果可能)或者使用shell(bash/ksh)脚本也可以。

我建议您使用某种脚本语言编写自己的“gzip分割”变体。否则,您将不得不多次读取那个250 GB的文件(首先确定其大小,然后在循环中始终获取一个切片并进行gzip压缩)。 - MacHala
独立解压部件有多重要?如果您只运行 split -b 1G file.gz,您最终将得到 250 个文件部分,您可以将它们连接在一起然后进行解压缩。 - Barton Chittenden
2个回答

5

split支持过滤命令。请使用以下代码:

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

正如我在问题中提到的那样,我的split版本不支持--filter选项。 - Kamlesh Gallani
在使用 Mac 时遇到了同样的问题,解决方法之一是使用 brew install coreutils 安装 GNU Coreutils。更多关于此问题的讨论可以参见这个 Unix Stack Exchange 帖子 - Konrad
@KamleshGallani,你能在不使用--filter选项的情况下完成这个任务吗? - Rajuk

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接