使用tar -zcvf时如何指定压缩级别?


142

我经常在工作中使用gzip目录。我通常要做的是

tar -zcvf file.tar.gz /path/to/directory

有没有办法在这里指定压缩级别?即使要花费更多的时间进行压缩,我也要使用最佳压缩率。

Answers:


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

假设您正在使用bash。通常,将GZIP环境变量设置为“ -9”,然后正常运行tar。

另外-如果您确实希望获得最佳压缩效果,请不要使用gzip。使用lzma或7z。

而且在使用gzip时(无论出于各种原因,这都是个好主意),请考虑使用pigzprogram而不是gzip


14
Pigz是“并行gzip”,它使用所有内核进行gzip压缩。您可以top使用200%-400 $ CPU之间的任何地方观看和查看它。
费利佩·阿尔瓦雷斯

2
仅供参考,对于.bz2格式,请使用:BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi

3
现在环境变量似乎是GZIP_OPT,用法应该相同。
Seer

3
在Ubuntu 16.04的gzip手册页上:“在Vax / VMS上,环境变量的名称为GZIP_OPT,以避免与调用该程序的符号集冲突。” 对于sh,csh和MSDOS,它仍然应该只是GZIP
Ponyboy47 '18

68

不用在tar中使用gzip标志,而是在tar处理之后手动gzip文件,然后可以为gzip程序指定压缩级别:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

或者您可以使用:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

gzip命令行中的-9告诉gzip使用最大可能的压缩级别(默认值为-6)。

编辑:修复了基于@depesz注释的管道命令行。


4
使用管道的操作应满足以下条件:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
第一个示例应以结尾file.tar,因为gzip添加了“ .gz”扩展名。
bonsaiviking

4
你为什么不跳过f -?如果没有文件,则为stdin / out
akostadinov

除了previos评论。从“ man tar”部分中环境:TAPE如果未指定--file,则用于归档的设备或文件。如果未设置此环境变量,请改用stdin或stdout。
Mikl

2
我们可以减少“ gzip -9-”->“ gzip -9”。来自“ man gzip”部分的描述:如果未指定文件,或者文件名为“-”,则标准输入将压缩为标准输出。
Mikl

53

现代版本的tar支持xz存档格式(GNU tar, 2009年以来为1.22,而Busybox 2010年以来为1.17.0)。

它基于lzma2,有点像gz7压缩版本。如果可以接受需要xz支持的需求,则可以提供更好的压缩效果。

tar -Jcvf file.tar.xz /path/to/directory

我刚刚在这里发现(基本上是这个问题的重复,但是在Unix stackexchange中),还有一个XZ_OPT = -9环境变量来控制XZ压缩级别,类似于另一篇文章中的GZIP。

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xz远胜过bzip2和gzip。进行比较: tukaani.org/lzma/benchmarks.html
User1

8
权衡是速度。XZ 明显慢一些。
贝尔

32
tar cv /path/to/directory | gzip --best > file.tar.gz

这是Matrix Mole的第二种解决方案,但略有缩短:

调用tar时,option f指出输出是文件。将其设置为-(stdout)会使tar将其输出写入到stdout中,这是默认行为,不带f-

并且如gzip手册页所述,如果未指定文件,则gzip将根据标准输入进行压缩。有没有必要-gzip呼叫。

选项--best(等效于-9)设置最高压缩级别。


1
这很漂亮。同样,如果您以root用户身份运行,则权限和所有者也会被保留。否则,您必须指定。另外,如果不太明显,“-9”是最佳压缩,“-1”是最快压缩。如果您有很多文件,“-1”仍然需要很长的时间;-)
PJ Brunet

这也适用于xzpixz。这是控制用于并行压缩的线程数的好方法,而无需创建中间的.tar文件。像这样tar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom 2015年

10

还可以使用-I指定压缩程序。这可以包括压缩级别选项。

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
较旧版本的tar(例如CentOS 6和7中提供的版本)不支持在-Iarg中提供参数,它们会尝试将整个内容视为要执行的程序名称,因此会失败。至少从Debian Stretch的tar 1.29开始,这确实有效。
猎豹

2

当然,macOS bsd衍生的tar必须有所不同:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
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.