一次性高效地对数千个文件进行 Gzip 压缩

一次性高效地对数千个文件进行 Gzip 压缩

我想将几千个小文件的内容压缩成一个文件。虽然我可以使用类似 的方法来实现for file in $(find . -iname 'pattern'); do; cat $file | gzip - >> zipped.gz; done;,但第一次压缩效果很差。虽然使用 重新压缩很容易,但zcat zipped.gz | gzip --best > rezipped.gz我想知道是否有人知道一种一次性完成此操作的好方法。

答案1

当我发现最佳行为是将所有文件放入单个流中时,我正在用循环来解决问题。但后来我意识到有一种更简单(更好)的方法:

find . -iname 'pattern' -exec cat {} \; | gzip --best - > file.gz

所有 cat 调用都将转到 find 的标准输出,只有一次 gzip 调用。重新压缩结果会产生相同的文件大小。如果您使用 -exec 的 + 版本(请参阅 find 手册页),您可能会得到更好的结果(就 cat 调用次数而言,而不是文件大小而言),但我还没有测试过。

答案2

find . -iname 'pattern' | xargs gzip -9 -v

编辑

看起来当您 cat 文件时,gzip 能够更好地压缩它。

这可能有效:

for TXT in $(find /PATH/TO/TXT/FILES -iname '*.txt'); do cat ${TXT} | gzip -9 > ${TXT}.gz; done

在我的 Mac 上,原始文本文件未被删除。因此,运行脚本后,原始文本文件和压缩文件都存在。

您可以轻松添加

rm -f /PAHT/TO/TXT/FILES/${TXT}

进入循环以删除纯文本文件。

相关内容