Linux - 有没有办法使用管道将 .bz2 文件转换为 .tar.bz2 文件?

Linux - 有没有办法使用管道将 .bz2 文件转换为 .tar.bz2 文件?

有没有办法将 .bz2 文件转换为 .tar.bz2 文件,而无需将整个文件解压到磁盘然后重新压缩?解压后的大小比我的驱动器还大。由于 bz2 操作的是块,因此似乎您可以解压一个块,将其传输到管道,重新压缩,从内存中删除解压后的块,等等。

我问过这个在 Ubuntu 论坛上但没有找到答案。

答案1

更新:我原来的答案根本不起作用,抱歉。 tar不会接受来自 STDIN 的数据流作为输入,因此第一个命令失败。

我能想到的唯一实现你想要的方法是编写自己的程序,tar在数据流周围添加所需的标头等。然后你可以写:

$ bzcat foo.bz2 | stream-to-tar | bzip - > foo.tar.bz2

...并且(假设您的程序tar格式正确)您可以使用标准对其进行解压缩tar xf foo.tar.bz2


这可能不是您想要做的,因为它首先不提供 tar 文件的任何常见优势。

$ bzcat foo.bz2 | tar cjf foo.tar.bz2 -

现在,问题是 tar 不包含任何文件系统,因为我们提供给它的只是一个解压的数据流。这意味着您需要像这样解压/解压它:

$ tar --to-stdout -xjf foo.tar.bz2 > foo

答案2

我想你会发现答案是:你不会这样做。如果你使用 压缩.tbz2文件,那么从文件获得的压缩率非常小。以下是 httpd 错误日志的一个示例:.bz2--best

 39M ./httpd-error.log
904K ./httpd-error.log.bz2
904K ./httpd-error.log.tbz2

否则,您必须通过硬盘停止来执行此操作。

相关内容