2012-12-01 20:47:48 +0000 2012-12-01 20:47:48 +0000
67
67

如何用.tar.gz获得最大的压缩?

我理解的tar+gzip的用法是,tar通常用来将一组文件合并成一个文件,然后gzip用来压缩这个文件。

我最近才知道tar也可以压缩。

因为我并不完全了解压缩的核心工作原理,所以我有(可能是荒谬的)顾虑,担心发送一个预压缩的.tar到gzip可能会阻止gzip压缩,因为它的潜力会允许这样做。

我的问题主要是。我应该用什么样的参数/压缩方法组合来创建绝对最小的tar.gz 命令行语句是怎样的?

答案 (4)

118
118
118
2013-01-31 18:55:22 +0000

或者,你可以这样告诉 tar 用户最大压缩量:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

另外,为了让你的 envvars 不乱,你可以这样做。

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
44
44
44
2012-12-02 03:37:18 +0000

正如你所说–“tar can also compress",这意味着–tar并不总是自行压缩数据。

只有当与z选项一起使用时,它才会这样做。它也不是自己压缩,而是通过 gzip 传递压缩后的数据。

然而,正如在 这个 答案中所指出的,你可以用管道将这两个命令连接起来。tar & gzip,这样你就可以明确指定gzip命令的压缩级别,以达到最小的输出大小。

tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

这里 9 指定了最大可能的压缩级别。

17
17
17
2014-03-10 15:23:08 +0000

通常gzip和tar都不能创建 “绝对最小的tar.gz"。有很多压缩工具可以压缩成gz格式。我写了一个bash脚本gz99"来尝试gzip7zadvdef来获得最小的文件。要使用这个脚本来创建最小的文件,请运行。

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可以获得更多的空间,而不需要花费太多的压缩时间。

6
6
6
2014-02-06 18:25:54 +0000
tar c /path/to/data | gzip --best > file.tar.gz

gzip选项--best(相当于-9)询问最高压缩级别。