我有一堆 gzip 文件,需要不时将其转换为 bzip2。目前,我使用一个 shell 脚本,只需对每个文件执行“gunzip”,然后对其进行“bzip2”即可。虽然这可行,但它需要很多需要花很多时间才能完成。
是否有可能使这个过程更有效率?如果有必要,我准备深入研究 gunzip 和 bzip2 的源代码,但我只是想确定回报。是否有希望提高这个过程的效率?
答案1
答案2
我想知道,使用管道是否比在一个步骤中使用 gunzip 并在另一步骤中使用 bzip2 更有效。例如gunzip --to-stdout foo.gz | bzip2 > foo.bz2
我认为如果有两个或更多 CPU,速度肯定会更快。但即使只有一个核心,速度也可能更快。不过,我很惭愧地承认我还没有尝试过。
答案3
GNU 并行 (http://www.gnu.org/software/parallel)可能是一个选项,如果你有多个核心(甚至多台机器):
ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"
阅读教程/手册页以了解详细信息和选项。
答案4
有时,我需要对日志文件执行相同的操作。我首先从最小的 *.gz 文件开始 ( ls -rS
),然后分别对它们进行 gunzip 和 bzip2 操作。我不知道是否可以将 gunzip 输出直接定向到 bzip2 输入。bzip2 命令的压缩速度比 gunzip 的解压速度慢得多,因此可能会消耗主机上的内存和交换空间。
欢迎提出改进或建议。以下是我的一句话:
for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done