![Linux - 有没有办法使用管道将 .bz2 文件转换为 .tar.bz2 文件?](https://linux22.com/image/1218450/Linux%20-%20%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E4%BD%BF%E7%94%A8%E7%AE%A1%E9%81%93%E5%B0%86%20.bz2%20%E6%96%87%E4%BB%B6%E8%BD%AC%E6%8D%A2%E4%B8%BA%20.tar.bz2%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
有没有办法将 .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
否则,您必须通过硬盘停止来执行此操作。