¿Cómo especificar el nivel de compresión cuando se usa tar -zcvf?

143

Gzip directorios muy a menudo en el trabajo. Lo que normalmente hago es

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

¿Hay alguna manera de especificar el nivel de compresión aquí? Quiero utilizar la mejor compresión posible, incluso si lleva más tiempo comprimir.

Lazer
fuente

Respuestas:

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

asumiendo que estás usando bash. En general, configure la variable de entorno GZIP en "-9" y ejecute tar normalmente.

Además, si realmente desea la mejor compresión, no use gzip. Use lzma o 7z.

Y cuando use gzip (que de todos modos es una buena idea por varias razones) considere usar el pigzprograma y no el gzip.


fuente
14
pigz es "gzip paralelo" que utiliza todos sus núcleos para la compresión gzip. Puede verlo topy verlo en cualquier lugar entre 200% -400 $ CPU.
Felipe Alvarez
2
Para su información, para el formato .bz2, use: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi
3
La variable de entorno parece ser ahora GZIP_OPT, el uso debería ser el mismo.
Vidente
3
Desde la página de manual en Ubuntu 16.04 para gzip: "En Vax / VMS, el nombre de la variable de entorno es GZIP_OPT, para evitar un conflicto con el símbolo establecido para la invocación del programa". Para sh, csh y MSDOS, debería seguir siendo GZIP
Ponyboy47
68

En lugar de usar el indicador gzip para tar, gzip los archivos manualmente después del proceso tar, luego puede especificar el nivel de compresión para el programa gzip:

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

O podrías usar:

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

El -9 en la línea de comando gzip le dice a gzip que use el nivel de compresión máximo posible (el valor predeterminado es -6).

Editar: línea de comando de tubería fija basada en el comentario de @depesz.

Topo matricial
fuente
44
El uso de tuberías debe hacerse con:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1
El primer ejemplo debe terminar con file.tar, ya que gzipagrega la extensión ".gz".
bonsaiviking
44
¿Por qué no te saltas f -? si no hay archivo, entonces es stdin / out
akostadinov
Además del comentario anterior. De la sección "man tar" Entorno: TAPE Dispositivo o archivo a utilizar para el archivo si no se especifica --file. Si esta variable de entorno no está establecida, use stdin o stdout en su lugar.
Mikl
2
y podemos reducir "gzip -9 -" -> "gzip -9". De la sección "man gzip" Descripción: Si no se especifican archivos, o si el nombre de un archivo es "-", la entrada estándar se comprime a la salida estándar.
Mikl
53

Las versiones modernas de tar admiten el formato de archivo xz (GNU tar, desde 1.22 en 2009, Busybox desde 1.17.0 en 2010).

Está basado en lzma2 , algo así como una versión 7-Zip de gz . Esto proporciona una mejor compresión si está de acuerdo con el requisito de necesitar soporte xz.

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

Acabo de descubrir aquí (básicamente un engaño de esta pregunta, pero en el intercambio de pila de Unix) que también hay una variable de entorno XZ_OPT = -9 para controlar el nivel de compresión XZ similar al de GZIP en la otra publicación.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
David C. Bishop
fuente
2
+1 xz es mucho mejor que bzip2 y gzip. Aquí hay una comparación: tukaani.org/lzma/benchmarks.html
Usuario1
8
La compensación es la velocidad. XZ es significativamente más lento.
Bell
32
tar cv /path/to/directory | gzip --best > file.tar.gz

Esta es la segunda solución de Matrix Mole, pero ligeramente acortada:

Al llamar a tar, la opción findica que la salida es un archivo. Establecerlo en -(stdout) hace que tar escriba su salida en stdout, que es el comportamiento predeterminado sin ambos fy -.

Y como lo indica la gzippágina de manual, si no se especifican archivos, gzip se comprimirá desde la entrada estándar. No hay necesidad -en la gzipllamada.

La opción --best(equivalente a -9) establece el nivel de compresión más alto.

carlito
fuente
1
Esto funciona de maravilla. Además, si se ejecuta como root, también se conservan los permisos y propietarios. De lo contrario, debe especificar. Además, si no fuera obvio, "-9" es la mejor compresión y "-1" es la compresión más rápida. "-1" todavía toma mucho tiempo si tiene muchos archivos ;-)
PJ Brunet
Esto funciona con xzy pixztambién. Es una excelente manera de controlar la cantidad de subprocesos utilizados para la compresión paralela sin tener que crear un archivo .tar intermedio. Me gusta asítar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom
10

También existe la opción de especificar el programa de compresión usando -I. Esto puede incluir la opción de nivel de compresión.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Chris Gibson
fuente
2
Las versiones más antiguas de tar, como la que se proporciona en CentOS 6 y 7, no admiten la presentación de argumentos en el argumento -I, intentarán tratar todo como un nombre de programa para exec y, por lo tanto, fallarán. Al menos a partir de tar 1.29 en Debian Stretch, esto funciona.
Cheetah
2

Y, por supuesto, el tar derivado de bsd de macOS tiene que ser diferente:

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