如何用.tar.gz获得最大的压缩?
我理解的tar+gzip的用法是,tar
通常用来将一组文件合并成一个文件,然后gzip
用来压缩这个文件。
我最近才知道tar
也可以压缩。
因为我并不完全了解压缩的核心工作原理,所以我有(可能是荒谬的)顾虑,担心发送一个预压缩的.tar到gzip可能会阻止gzip压缩,因为它的潜力会允许这样做。
我的问题主要是。我应该用什么样的参数/压缩方法组合来创建绝对最小的tar.gz 命令行语句是怎样的?
我理解的tar+gzip的用法是,tar
通常用来将一组文件合并成一个文件,然后gzip
用来压缩这个文件。
我最近才知道tar
也可以压缩。
因为我并不完全了解压缩的核心工作原理,所以我有(可能是荒谬的)顾虑,担心发送一个预压缩的.tar到gzip可能会阻止gzip压缩,因为它的潜力会允许这样做。
我的问题主要是。我应该用什么样的参数/压缩方法组合来创建绝对最小的tar.gz 命令行语句是怎样的?
或者,你可以这样告诉 tar 用户最大压缩量:
export GZIP=-9
tar cvzf file.tar.gz /path/to/directory
另外,为了让你的 envvars 不乱,你可以这样做。
env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
正如你所说–“tar can also compress",这意味着–tar
并不总是自行压缩数据。
只有当与z
选项一起使用时,它才会这样做。它也不是自己压缩,而是通过 gzip 传递压缩后的数据。
然而,正如在 这个 答案中所指出的,你可以用管道将这两个命令连接起来。tar
& gzip
,这样你就可以明确指定gzip
命令的压缩级别,以达到最小的输出大小。
tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
这里 9
指定了最大可能的压缩级别。
通常gzip和tar都不能创建 “绝对最小的tar.gz"。有很多压缩工具可以压缩成gz格式。我写了一个bash脚本gz99"来尝试gzip
、7z
和advdef
来获得最小的文件。要使用这个脚本来创建最小的文件,请运行。
tar c path/to/data | gz99 file.gz
来自AdvanceCOMP的advdef
实用程序通常会给出最小的文件,但也是个bug (gz99
实用程序在接受advdef
的输出前会检查它是否损坏了文件). 如果要直接使用advdef
,可以按照自己的感觉创建file.tar.gz。然后运行。
advdef -z -4 file.tar.gz
这将创建一个标准的gz文件,可以像正常的gzip和tar文件一样被读取,只是小了一点。这是你对 gz 格式能做的最好的事情了。
由于你最近才知道 tar 可以压缩,也没有说为什么要用最小的”.tar.gz “文件,你可能不知道还有更有效的格式可以用于 tar 文件,比如 xz。一般来说,换一种不同的格式比起在gzip选项上瞎折腾,能给压缩带来更好的改善。xz的主要缺点是它不像gzip那么普遍,所以你发送文件的人可能需要安装一个新的软件包。它的速度也会慢一些,尤其是在压缩的时候。如果这对你来说并不重要,而且你真的想要最小的 tar 文件,可以试试。
tar cv path/to/data | xz -9 > file.tar.xz
现代版本的tar文件,比如Ubuntu 13.10,会自动检测压缩文件。因此,即使你使用 xz 压缩,你仍然可以像往常一样解压:
tar xvf file.tar.xz
为了快速了解这些压缩工具的比较,请考虑压缩 linux 内核的 patch-3.1.1 的效果。
utility cpu format size(bytes)
gzip -9 0.02s gz 105,628
advdef -2 0.07s gz 102,619
7z -mx=9 -tgzip 0.42s gz 102,297
advdef -3 0.55s gz 102,290
advdef -4 0.75s gz 101,956
xz -9 0.03s xz 91,064
xz -3e 0.15s xz 90,996
在这个微不足道的例子中,我们可以看到,为了得到最小的gz,我们需要使用advdef(尽管7z -tgzip几乎同样好,而且错误也少很多)。我们还看到,与试图从旧的gz格式中挤出更多的空间相比,改用xz可以获得更多的空间,而不需要花费太多的压缩时间。