高效地将 gzip 文件转换为 bzip2

高效地将 gzip 文件转换为 bzip2

我有一堆 gzip 文件,需要不时将其转换为 bzip2。目前,我使用一个 shell 脚本,只需对每个文件执行“gunzip”,然后对其进行“bzip2”即可。虽然这可行,但它需要很多需要花很多时间才能完成。

是否有可能使这个过程更有效率?如果有必要,我准备深入研究 gunzip 和 bzip2 的源代码,但我只是想确定回报。是否有希望提高这个过程的效率?

答案1

这个问题很久以前就被问过,当时压缩包要么不可用,要么无法从标准输入进行压缩,但现在你可以使用以下方法并行执行解压缩和压缩步骤平行线压缩包(代替bzip2):

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

这比使用bzip2

答案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

相关内容