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

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


是否可以在此处指定压缩级别?即使要花费更多的时间进行压缩,我也要使用最佳压缩。

#1 楼

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


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

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

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

评论


Pigz是“并行gzip”,它使用所有内核进行gzip压缩。您可以使用200%-400 $ CPU之间的任何位置观看顶部并查看它。

–Felipe Alvarez
2013年12月9日在2:01

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

–桃文
17 Mar 2 '17 at 2:59



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

–Seer
17年5月5日在11:59

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

– Ponyboy47
18年6月2日在16:13



这是我尝试将GZIP环境变量设置为-9时得到的结果:gzip:警告:GZIP环境变量已弃用;使用别名或脚本

–patryk.beza
19-10-31在10:43



#2 楼

您可以在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注释的固定管道命令行。

评论


使用管道应通过以下方式完成:tar cvf-/ path / to / directory | gzip -9-> file.tar.gz

–user7385
2011年7月1日在18:40

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

–bonsaiviking
13年2月4日在18:20

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

–akostadinov
2013年9月19日在18:52

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

– Mikl
13年9月24日在17:08

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

– Mikl
2013年9月24日17:18



#3 楼

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

它基于lzma2,类似于gz的7压缩版本。如果您可以接受需要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


评论


+1 xz远胜过bzip2和gzip。比较一下:tukaani.org/lzma/benchmarks.html

–User1
2012-12-25 15:44



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

–贝尔
17年4月6日在23:02

没有。在压缩比,压缩/解压缩速度方面,xz -1明显优于bz2 -1〜9。 bz2是流行格式中最糟糕的格式。简而言之,如果您曾经使用过bz2,请尝试使用xz -1,就可以了。

–梦瑶
20-10-14在1:54

#4 楼

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


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

调用tar时,选项f指出输出是一个文件。将其设置为-(stdout)使tar将其输出写入到stdout,这是默认行为,而没有f-

并且如gzip手册页所述,如果未指定文件,则gzip将根据标准输入进行压缩。在-调用中不需要gzip

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

评论


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

– PJ Brunet
2013年12月12日4:04



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

– joelostblom
2015年2月12日在21:52



#5 楼

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

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


评论


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

–猎豹
17年7月7日在0:30

@Cheetah哪个版本的tar?

–折纸眼
20年4月1日在14:11

@Cheetah我可以确认它不适用于CentOS 7.x中的tar v1.26,返回此错误:tar(子):gzip -9:无法执行:没有这样的文件或目录

– Saurabh P Bhandari
20-10-16在4:16



#6 楼

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

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory