如何使用.tar.gz获得最大压缩?[重复]


63

这个问题已经在这里有了答案:

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

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

因为我不完全了解压缩在内核中是如何工作的,所以我担心(可能很荒谬)担心,将预压缩的.tar发送到gzip可能会阻止gzip压缩,因为它可能会阻止压缩以及这种性质的事情。

我的问题本质上是:我应该使用args /压缩方法的哪种组合来创建绝对最小的tar.gz,命令行语句的外观如何?


2
压缩已经压缩的文件可能会减小其大小,或者可能会使存档更大。这完全取决于数据类型和所使用的任何压缩。
Keltari 2013年

@Keltari说什么。压缩率和比率在很大程度上取决于您要压缩的内容,这也是为什么存在不同的压缩算法和方法的原因。
music2myear14年

Answers:


111

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

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

此外,要使envvar整洁,可以执行以下操作:

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

43

如您所说- “ tar也可以压缩 ”,意味着- tar并不总是自己压缩数据。

仅在与该z选件一起使用时才这样做。那也不是唯一的,而是-通过gzip传递了被污染的数据。

但是,相反,如答案所述,您可以通过管道传递两个命令:targzip,以便可以显式指定gzip命令的压缩级别以实现最小的输出大小。

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

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


我遇到了一个问题,即它不是递归的,并且抱怨说它将是一个空的归档文件,因为命令被拆分了,因为它已经是tar默认值,所以很难找到如何正确强制递归的方法。我的糟糕,我错误地指定了它的开头tar -cvf /path
Brian Thomas

17

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

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

advdefAdvanceCOMP 的实用程序通常会提供最小的文件,但也会出现问题(该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格式中获取最大的空间要多得多,而无需花费太长时间即可进行压缩。


OP询问如何最大程度地压缩.tar.gz文件,但您建议创建.tar.xz文件。您正在回答的问题与询问的问题不同。
ChrisInEdmonton 2014年

啊,我明白你要干什么。advdef只是在我的系统(v1.15)上崩溃,因此'advdef -z -4 file.tar.gz'不起作用,但至少在理论上是可以的。我找不到证据表明它会比'gzip -9'进一步缩小文件,但可能而且在任何情况下我都可以删除-1票。感谢您的澄清!
ChrisInEdmonton 2014年

嗯,我正在使用v1.17。无论如何,我里面的学数学家都想指出,我的回答在技术上可能是不正确的。毕竟,如果枚举所有可能的gz文件(从最短到最长),并选择第一个解压缩到正确文件的gz文件,则可以再剃掉一些字节。但这在实践中太慢了。
gmatht 2014年

我认为“ buggy”和“ archive”不应该同时使用,损坏的档案有什么用?你需要一个较大的文件,以“比较”的压缩工具,以及不同类型的输入文件了-在第二分歧百分之测量不可靠的,我认为xz -9通常需要像5倍的gz -9时间,而不是仅仅为1.5倍您的餐桌建议。
Xen2050

我们如何使用xz流程创建拆分存档(压缩时)
nyxee

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

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


4
或者,使用--best标志:-9对读者造成混淆。
om-nom-nom 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.