¿Cómo obtener la máxima compresión con .tar.gz? [duplicar]

63

Esta pregunta ya tiene una respuesta aquí:

La forma en que entiendo el uso de tar + gzip es que tarnormalmente se usa para consolidar una agrupación de archivos en un solo archivo, luego gzipse usa para comprimir ese archivo.

Hace poco aprendí que tartambién se puede comprimir.

Debido a que no entiendo completamente cómo funciona la compresión en su núcleo, tengo preocupaciones (posiblemente ridículas) de que enviar un .tar precomprimido a gzip podría evitar que gzip se comprima, así como su potencial lo permitiría y cosas de esa naturaleza.

Mi pregunta es esencialmente: ¿Qué combinación de args / métodos de compresión debo usar para crear el tar.gz más pequeño y absoluto, y cómo se ve la declaración de línea de comando para eso?

Mario Zigliotto
fuente
2
La compresión de archivos ya comprimidos puede reducir su tamaño o puede hacer que el archivo sea más grande. Todo depende del tipo de datos y de cualquier compresión que se utilice.
Keltari
Lo que dijo @Keltari. Las tasas y las tasas de compresión dependen en gran medida de lo que está comprimiendo, razón por la cual también existen diferentes algoritmos y métodos de compresión.
music2myear

Respuestas:

111

O puede indicarle a tar la compresión máxima del usuario de esta manera:

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

Además, para mantener tus envvars libres de desorden, puedes hacer esto:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Brian Fane
fuente
43

Como usted dijo, "el alquitrán también puede comprimir ", implica que tarno siempre comprime los datos por sí mismo.

Solo lo hace cuando se usa con la zopción. Eso tampoco por sí mismo, sino que pasa los datos tarred a través de gzip.

Sin embargo, como se indica en esta respuesta, puede canalizar los dos comandos: tar& gziptal que pueda especificar explícitamente el nivel de compresión para que el gzipcomando alcance el tamaño de salida más pequeño.

tar cvf - / ruta / al / directorio | gzip -9 -> file.tar.gz

Aquí 9especifica el nivel de compresión máximo posible.

Ujjwal Singh
fuente
Tuve un problema en el que no es recursivo, y se queja de que será un archivo vacío, ya que el comando está dividido, es difícil encontrar cómo forzar correctamente el recursivo, ya que es el valor predeterminado de tar. MI MALO, lo había especificado incorrectamente comenzando asítar -cvf /path
Brian Thomas, el
17

Por lo general, ni gzip ni tar pueden crear "el tar.gz más pequeño absoluto". Hay muchas utilidades de compresión que pueden comprimir al formato gz. He escrito un script bash " gz99 " para tratar gzip, 7zy advdefpara obtener el archivo más pequeño. Para usar esto para crear la ejecución de archivo más pequeña posible:

tar c path/to/data | gz99 file.gz

La advdefutilidad de AdvanceCOMP generalmente proporciona el archivo más pequeño, pero también tiene errores (la gz99utilidad verifica que no haya dañado el archivo antes de aceptar la salida de advdef). Para usar advdefdirectamente, crea file.tar.gz como quieras. Entonces corre:

advdef -z -4 file.tar.gz

Esto creará un archivo gz estándar que puede ser leído por gzip y tar de forma normal, solo un poco más pequeño. Esto es lo mejor que puedes hacer con el formato gz.

Como recientemente aprendió que el tar puede comprimirse y no dijo por qué quería el archivo ".tar.gz" más pequeño, es posible que no sepa que se pueden usar formatos más eficientes con los archivos tar, como xz. En general, cambiar a un formato diferente puede proporcionar una mejora mucho mejor en la compresión que jugar con las opciones de gzip. La principal desventaja de xz es que no es tan común como gzip, por lo que las personas a las que envía el archivo podrían tener que instalar un nuevo paquete. También tiende a ser un poco más lento, especialmente cuando se comprime. Si esto no te importa y realmente quieres el archivo tar más pequeño, prueba:

 tar cv path/to/data | xz -9 > file.tar.xz

Las versiones modernas de tar, por ejemplo en Ubuntu 13.10, detectan automáticamente los archivos comprimidos. Entonces, incluso si usa la compresión xz, aún puede descomprimir como de costumbre:

 tar xvf file.tar.xz

Para dar una idea rápida de cómo se comparan estas utilidades de compresión, considere el efecto de comprimir el parche 3.1.1 del núcleo de Linux:

utility         cpu    format  size(bytes)
gzip -9         0.02s  gz      105,628
advdef -2       0.07s  gz      102,619
7z -mx=9 -tgzip 0.42s  gz      102,297
advdef -3       0.55s  gz      102,290
advdef -4       0.75s  gz      101,956
xz -9           0.03s  xz       91,064
xz -3e          0.15s  xz       90,996

En este ejemplo trivial, vemos que para obtener el gz más pequeño necesitamos advdef (aunque 7z -tgzip es casi tan bueno y mucho menos defectuoso). También vemos que cambiar a xz nos da mucho más espacio que tratar de aprovechar al máximo el antiguo formato gz, sin que la compresión tarde demasiado.

gmatht
fuente
El OP preguntó cómo obtener la mayor compresión para un archivo .tar.gz, pero sugirió crear un archivo .tar.xz. Está respondiendo una pregunta diferente a la que se le preguntó.
ChrisInEdmonton
Ah, ya veo lo que buscas. advdef simplemente falla en mi sistema (v1.15), por lo que 'advdef -z -4 file.tar.gz' no funciona, pero al menos teóricamente podría funcionar. No puedo encontrar evidencia de que reduciría el archivo más allá de 'gzip -9', pero podría, y en cualquier caso es suficiente para que elimine mi voto -1. ¡Gracias por aclararlo!
ChrisInEdmonton
Hmm, estoy usando v1.17. De todos modos, el matemático pedante en mí quiere señalar que mi respuesta posiblemente no sea técnicamente correcta. Después de todo, si enumera todos los archivos gz posibles del más corto al más largo y elige el primero que se descomprime en el archivo correcto, podría eliminar algunos bytes más. Pero eso sería demasiado lento en la práctica.
gmatht
No creo que "buggy" y "archive" se deban usar juntos, ¿de qué sirve un archivo corrupto? Necesita un archivo mucho más grande para "comparar" las utilidades de compresión, y también diferentes tipos de archivos de entrada: medir en centésimas de segundo las diferencias no es tan confiable, creo que xz -9generalmente toma algo como 5 veces el gz -9tiempo, no solo 1.5 veces Su mesa sugiere.
Xen2050
¿cómo podemos crear archivos divididos (mientras comprime) usando el proceso xz favor
nyxee
6
tar c /path/to/data | gzip --best > file.tar.gz

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

carlito
fuente
44
Alternativamente, use --bestflag: -9 es confuso para el lector.
om-nom-nom