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.
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.Sign up to join this community
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
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 -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
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
--best (equivalent to
-9) sets the highest compression level.
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
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