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

Laz*_*zer 183 linux compression gzip tar

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

tar -zcvf file.tar.gz /path/to/directory
Run Code Online (Sandbox Code Playgroud)

有没有办法在这里指定压缩级别?即使压缩需要更多时间,我也想尽可能使用最佳压缩。

小智 179

GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Run Code Online (Sandbox Code Playgroud)

假设您正在使用 bash。一般将GZIP环境变量设置为“-9”,正常运行tar即可。

另外 - 如果你真的想要最好的压缩,不要使用 gzip。使用 lzma 或 7z。

并且在使用 gzip 时(无论如何出于各种原因这是个好主意)考虑使用pigzprogram 而不是gzip.

  • pigz 是“并行 gzip”,它使用所有内核进行 gzip 压缩。您可以观看 `top` 并使用 200%-400$ 之间的 CPU 来查看它。 (22认同)
  • 仅供参考,对于 .bz2 格式,请使用:BZIP2=-9 tar cvjf file.tar.bz2 /path/to/directory (5认同)
  • 环境变量现在好像是`GZIP_OPT`,用法应该是一样的。 (5认同)
  • 这是我尝试将 `GZIP` 环境变量设置为 `-9` 时得到的结果:*gzip: 警告:不推荐使用 GZIP 环境变量;使用别名或脚本* (4认同)
  • 来自 Ubuntu 16.04 上 gzip 的手册页:“在 Vax/VMS 上,环境变量的名称是 GZIP_OPT,以避免与程序调用的符号集冲突。” 对于 sh、csh 和 MSDOS,它仍然应该只是 GZIP (3认同)
  • @patryk.beza 见 /sf/ask/3231744071/。它说`-I 'gzip <args>'`现在是推荐的方式`。 (2认同)

小智 79

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

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar
Run Code Online (Sandbox Code Playgroud)

或者你可以使用:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

编辑:基于@depesz 注释的固定管道命令行。

  • 使用管道应该通过以下方式完成:`tar cvf - /path/to/directory | gzip -9 -> file.tar.gz` (5认同)
  • 你为什么不跳过`f -`?如果没有文件,那么它是标准输入/输出 (5认同)
  • 我们可以减少“gzip -9 -” -> “gzip -9”。来自“man gzip”部分说明:如果没有指定文件,或者文件名为“-”,则标准输入被压缩为标准输出。 (2认同)

Dav*_*hop 72

tar 的现代版本支持 xz 存档格式(GNU tar,2009年的 1.22起,Busybox2010年的 1.17.0起)。

它基于lzma2,有点像gz7-Zip版本。如果您满足需要 xz 支持的要求,这会提供更好的压缩。

tar -Jcvf file.tar.xz /path/to/directory
Run Code Online (Sandbox Code Playgroud)

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

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
Run Code Online (Sandbox Code Playgroud)

  • 权衡是速度。XZ *明显*慢。 (11认同)
  • +1 xz 远好于 bzip2 和 gzip。这是一个比较:http://tukaani.org/lzma/benchmarks.html (5认同)

car*_*ito 39

tar cv /path/to/directory | gzip --best > file.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

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

正如gzip手册页所述,如果没有指定文件,gzip 将从标准输入压缩。-gzip通话中没有必要。

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

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

小智 19

还可以选择使用-I. 这可以包括压缩级别选项。

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Run Code Online (Sandbox Code Playgroud)

请注意,该-I选项是 的简写--use-compress-program=COMMAND。如果您使用的不是GNUtar而是BSD,tar这一点很重要。后者使用-I选项作为选项的简写--files-from filename

因此,要使您的命令“跨平台”,您可以编写:

tar --use-compress-program='gzip -9' -cvf file.tar.gz /path/to/directory
Run Code Online (Sandbox Code Playgroud)

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

rfa*_*fay 12

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

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
Run Code Online (Sandbox Code Playgroud)