![一次性高效地对数千个文件进行 Gzip 压缩](https://linux22.com/image/1424557/%E4%B8%80%E6%AC%A1%E6%80%A7%E9%AB%98%E6%95%88%E5%9C%B0%E5%AF%B9%E6%95%B0%E5%8D%83%E4%B8%AA%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%20Gzip%20%E5%8E%8B%E7%BC%A9.png)
我想将几千个小文件的内容压缩成一个文件。虽然我可以使用类似 的方法来实现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}
进入循环以删除纯文本文件。