I gzip directories very often at work. What I normally do is
tar -zcvf file.tar.gz /path/to/directory
Is there a way to specify the compression level here? I want to use the best compression possible even if it takes more time to compress.
GZIP=-9 tar cvzf file.tar.gz /path/to/directory
assuming you're using bash. Generally, set GZIP
environment variable to "-9", and run tar normally.
Also - if you really want best compression, don't use gzip. Use lzma or 7z.
And when using gzip (which is good idea for various of reasons anyway) consider using pigz
program and not the gzip
.
top
and see it using anywhere between 200%-400$ CPU.
Commented
Dec 9, 2013 at 2:01
GZIP_OPT
, the usage should be the same.
GZIP
environment variable to -9
: gzip: warning: GZIP environment variable is deprecated; use an alias or script
Commented
Oct 31, 2019 at 10:43
Instead of using the gzip flag for tar, gzip the files manually after the tar process, then you can specify the compression level for the gzip program:
tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar
Or you could use:
tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz
The -9 in the gzip command line tells gzip to use the maximum possible compression level (default is -6).
Edit: Fixed pipe command line based on @depesz comment.
tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
file.tar
, since gzip
adds the ".gz" extension.
Commented
Feb 4, 2013 at 18:20
f -
? if there is no file, then it is stdin/out
Commented
Sep 19, 2013 at 18:52
Modern versions of tar support the xz archive format (GNU tar, since 1.22 in 2009, Busybox since 1.17.0 in 2010).
It's based on lzma2, kind of like a 7-Zip version of gz. This gives better compression if you are ok with the requirement of needing xz support.
tar -Jcvf file.tar.xz /path/to/directory
I just found out here (basically a dupe of this question, but in the Unix stackexchange) that there is also a XZ_OPT=-9 environment variable to control the XZ compression level similar to the GZIP one in the other post.
XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
tar cv /path/to/directory | gzip --best > file.tar.gz
This is Matrix Mole's second solution, but slightly shortened:
When calling tar, option f
states that the output is a file. Setting it to -
(stdout) makes tar write its output to stdout which is the default behavior without both f
and -
.
And as stated by the gzip
man page, if no files are specified gzip will compress from standard input. There is no need for -
in the gzip
call.
Option --best
(equivalent to -9
) sets the highest compression level.
xz
and pixz
too. It is a great way to control the number of threads used for parallel compressing without having to create an intermediate .tar file. Like so tar -cv /path/to/dir | pixz -p4 > output.tpxz
Commented
Feb 12, 2015 at 21:52
There is also the option to specify the compression program using -I
. This can include the compression level option.
tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Note that the -I
option is shorthand for --use-compress-program=COMMAND
. This is important if you're not using GNU tar
but BSD tar
.
The latter uses the -I
option as shorthand for the --files-from filename
option.
So to be make your command "cross-platform" you could write:
tar --use-compress-program='gzip -9' -cvf file.tar.gz /path/to/directory
-I
arg, they will try to treat the whole thing as a program name to exec, and thus fail. At least as of tar 1.29 in Debian Stretch, this does work.
tar (child): gzip -9: Cannot exec: No such file or directory
Commented
Oct 16, 2020 at 4:16
tar -I '/bin/gzip -9' -cvf file.tar.gz /path/to/directory
.
'gzip'
works, '/bin/gzip'
works, '/bin/gzip -9'
doesn't.
Commented
Jun 6, 2021 at 15:24
And of course macOS bsd-derived tar has to be different:
tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
--use-compress-program
works there too, so I'd use that for portability
Commented
Jul 6, 2022 at 23:46