我理解 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“尝试gzip
,7z
并advdef
获取最小的文件。要使用它来创建最小的可能文件,请运行:
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
)要求最高压缩级别。