如何使用 .tar.gz 获得最大程度压缩?

如何使用 .tar.gz 获得最大程度压缩?

我理解 tar + gzip 的用法是,它tar通常用于将一组文件合并为一个文件,然后gzip用于压缩该文件。

我最近了解到tar也可以压缩。

因为我不完全理解压缩的核心工作原理,所以我担心(可能很荒谬)将预压缩的 .tar 发送到 gzip 可能会阻止 gzip 进行压缩,以及其潜在的压缩以及诸如此类的事情。

我的问题本质上是:我应该使用哪种参数/压缩方法组合来创建绝对最小的 tar.gz,以及该命令行语句是什么样的?

答案1

或者,您可以通过这种方式告诉 tar 用户最大压缩率:

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

此外,为了保持你的环境整洁,你可以这样做:

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

答案2

正如你所说——”焦油罐压缩“,意味着 -tar总是自行压缩数据。只有与选项一起使用时才会这样做z。这也不是自行压缩,而是通过将压缩后的数据通过 gzip 传递。

然而,正如答案,您可以通过管道连接这两个命令:tar& gzip,这样您就可以明确指定gzip命令的压缩级别,以实现最小的输出大小。

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

此处9指定最大可能的压缩级别。

答案3

通常,gzip 和 tar 都无法创建“绝对最小的 tar.gz”。有许多压缩实用程序可以压缩为 gz 格式。我写了一个 bash 脚本“gz99“尝试gzip7zadvdef获取最小的文件。要使用它来创建最小的可能文件,请运行:

tar c path/to/data | gz99 file.gz

AdvanceCOMP 提供的实用程序advdef通常会生成最小的文件,但也存在错误(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 几乎一样好,而且错误少得多)。我们还看到,切换到 xz 比试图从旧的 gz 格式中榨干更多空间,压缩也不会花费太长时间。

答案4

tar c /path/to/data | gzip --best > file.tar.gz

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

相关内容