这个问题已经在这里有了答案:
我了解tar + gzip的用法的tar
方法通常是将一组文件合并为一个文件,然后gzip
用于压缩该文件。
我最近了解到也tar
可以压缩。
因为我不完全了解压缩在内核中是如何工作的,所以我担心(可能很荒谬)担心,将预压缩的.tar发送到gzip可能会阻止gzip压缩,因为它可能会阻止压缩以及这种性质的事情。
我的问题本质上是:我应该使用args /压缩方法的哪种组合来创建绝对最小的tar.gz,命令行语句的外观如何?
这个问题已经在这里有了答案:
我了解tar + gzip的用法的tar
方法通常是将一组文件合并为一个文件,然后gzip
用于压缩该文件。
我最近了解到也tar
可以压缩。
因为我不完全了解压缩在内核中是如何工作的,所以我担心(可能很荒谬)担心,将预压缩的.tar发送到gzip可能会阻止gzip压缩,因为它可能会阻止压缩以及这种性质的事情。
我的问题本质上是:我应该使用args /压缩方法的哪种组合来创建绝对最小的tar.gz,命令行语句的外观如何?
Answers:
如您所说- “ tar也可以压缩 ”,意味着- tar
并不总是自己压缩数据。
仅在与该z
选件一起使用时才这样做。那也不是唯一的,而是-通过gzip传递了被污染的数据。
但是,相反,如本答案所述,您可以通过管道传递两个命令:tar
&gzip
,以便可以显式指定gzip
命令的压缩级别以实现最小的输出大小。
tar cvf-/ path / to / directory | gzip -9-> file.tar.gz
在此9
指定最大可能的压缩级别。
tar -cvf /path
通常,gzip和tar都无法创建“绝对最小的tar.gz”。有许多压缩实用程序可以压缩为gz格式。我写了一个bash脚本“ gz99 ”尝试gzip
,7z
并advdef
获得最小的文件。要使用它来创建最小的文件,请运行:
tar c path/to/data | gz99 file.gz
advdef
AdvanceCOMP 的实用程序通常会提供最小的文件,但也会出现问题(该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格式中获取最大的空间要多得多,而无需花费太长时间即可进行压缩。
xz -9
通常需要像5倍的gz -9
时间,而不是仅仅为1.5倍您的餐桌建议。
tar c /path/to/data | gzip --best > file.tar.gz
gzip
选项--best
(等效于-9
)要求最高压缩级别。
--best
标志:-9对读者造成混淆。