我在 Linux 上有一个 250GB 的 gzipped 文件,我想将它拆分为 250 个 1GB 文件并动态压缩生成的部分文件(一旦生成一个文件,就应该对其进行压缩)。我试过用这个 -
zcat file.gz | split -b 1G – file.gz.part
Run Code Online (Sandbox Code Playgroud)
但这正在生成未压缩的文件,这是正确的。我将其修改为如下所示,但出现错误:
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
Run Code Online (Sandbox Code Playgroud)
我也试过这个,它没有抛出任何错误,但没有在生成零件文件后立即压缩它们。我假设这将在整个拆分完成后压缩每个文件(或者它可能会打包所有部分文件并在拆分完成后创建单个 gz 文件,我不确定)。
zcat file.gz | split -b 1G - file.gz.part && gzip
Run Code Online (Sandbox Code Playgroud)
我在这里读到有一个过滤器选项,但我的 split 版本是 (GNU coreutils) 8.4,因此不支持过滤器。
$ split --version
split (GNU coreutils) 8.4
Run Code Online (Sandbox Code Playgroud)
请建议一种合适的方法来实现这一点,最好使用单行代码(如果可能)或 shell (bash/ksh) 脚本也可以使用。
split 支持过滤命令。用这个:
zcat file.gz | split - -b 1G --filter='gzip > $FILE.gz' file.part.
Run Code Online (Sandbox Code Playgroud)
这绝对不是最理想的,但我尝试用 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
Run Code Online (Sandbox Code Playgroud)