Siempre he usado TAR y ZIP para la compresión, pero recientemente escuché sobre el *.Z
algoritmo de compresión. Esto me trajo una pregunta:
Con todos estos sistemas de compresión, ¿cuál es el mejor para uso general y compresión?
Al ejecutar algunas pruebas, descubrí que tar
, como descubrí, NO se comprime realmente (a menos que se especifique explícitamente). Es decir, ¿para qué sirve en comparación con otros métodos de compresión?
Soy consciente de que ya postal es el sistema de compresión más ampliamente utilizado, ya menudo debo usar en lugar de *.Z
, *.7z
, .tar
, o .tar.<insert ending here>
?
Resumen de la publicación:
- ¿Debo usar
*.tar
,*.Z
,*.7z
,.tar
, o.tar.<insert ending here>
para la mejor compresión? - Si plain
*.tar
no se comprime, ¿por qué lo usamos?
EDITAR: No todos los algoritmos permiten almacenar permisos de Linux (de lo que aprendí). ¿Qué hago y hay algún tipo de pirateo (o script) que podría usar para almacenar permisos?
fuente
Respuestas:
tar
significa archivo de cinta. Todo lo que hace es empaquetar archivos y sus metadatos (permisos, propiedad, etc.) en una secuencia de bytes que pueden almacenarse en una unidad de cinta (o un archivo) y restaurarse más tarde. La compresión es un asunto completamente separado que solía tener que canalizar la salida a través de una utilidad externa para comprimir si así lo deseaba. GNU tar fue lo suficientemente agradable como para agregar interruptores para decirle que filtre automáticamente la salida a través de la utilidad adecuada como acceso directo.Zip y 7z combinan el archivo y la compresión en su propio formato contenedor, y están destinados a empaquetar archivos en un sistema DOS / Windows, por lo que no almacenan los permisos y la propiedad de Unix. Por lo tanto, si desea almacenar los permisos para las copias de seguridad adecuadas, debe seguir con tar. Si planea intercambiar archivos con usuarios de Windows, entonces zip o 7z es bueno. Los algoritmos de compresión reales de uso zip y 7zip se pueden usar con tar, uzing
gzip
ylzma
respectivamente.lzma (también conocido como * .xz) tiene una de las mejores relaciones de compresión, y es bastante rápido en descompresión, por lo que es una de las mejores opciones en estos días. Sin embargo, requiere una tonelada de tiempo de RAM y CPU para comprimir. El venerable
gzip
es bastante más rápido en la compresión, por lo que puede usarse si no desea dedicar tanto tiempo de CPU. También tiene una variante aún más rápida llamada lzop.bzip2
sigue siendo bastante popular ya que reemplazó en gran medida a gzip por un tiempo antes de que surgiera 7zip / lzma, ya que obtuvo mejores relaciones de compresión, pero está cayendo en desgracia en estos días ya que 7z / lzma es más rápido en la descompresión y obtiene mejores relaciones de compresión. Lacompress
utilidad, que normalmente nombra archivos * .Z, es antigua y olvidada hace mucho tiempo.Una de las otras diferencias importantes entre zip y tar es que zip comprime los datos en pequeños fragmentos, mientras que cuando comprime un archivo tar, comprime todo de una vez. Este último proporciona mejores relaciones de compresión, pero para extraer un solo archivo al final del archivo, debe descomprimir todo para acceder a él. Por lo tanto, el formato zip es mejor para extraer uno o dos archivos de un archivo grande. 7z y le
dar
permite elegir comprimir todo (llamado modo "sólido") o pequeños trozos para una fácil extracción por partes.fuente
gzip
.tar cfp
preservará los permisos. Un archivo tar no está comprimido, por lo que zip (7-zip), gzip2, gzip, lzo, etc. comprimirán bien un archivo tar (en general, es poco probable que un archivo de archivos comprimidos sea comprimible).Los detalles de los algoritmos están fuera de tema aquí 1 ya que no son de ninguna manera específicos de Linux, y mucho menos de Ubuntu. Sin embargo, encontrará información agradable aquí .
Ahora
tar
, como dijiste,tar
no es y nunca ha sido un programa de compresión. En cambio, es un archivador ; Su propósito principal es hacer un archivo grande de muchos pequeños. Históricamente, esto era para facilitar el almacenamiento en unidades de cinta, de ahí el nombre: Tape ARchive.Hoy, la razón principal para usar
tar
es disminuir la cantidad de archivos en su sistema. Cada archivo en un sistema de archivos Unix ocupa un inodo , cuantos más archivos tenga, menos inodos disponibles y cuando se quede sin inodos, ya no podrá crear nuevos archivos. En pocas palabras, la misma cantidad de datos almacenados que miles de archivos ocuparán más de su disco duro que esos mismos archivos en un solo archivo tar.Para ilustrar, dado que esto ha sido cuestionado en los comentarios, en mi
/
partición 68G , tengo el siguiente número de inodos totales y usados (tenga en cuenta que el recuento de inodos depende del tipo de sistema de archivos y el tamaño de la partición):Si ahora procedo a intentar crear más archivos de los que tengo inodos:
¿Sin espacio? Pero tengo mucho espacio:
Como puede ver arriba, crear unos cientos de miles de archivos vacíos agota rápidamente mis inodos y ya no puedo crear nuevos. Si fuera a
tar
estos, podría comenzar a crear archivos nuevamente.Tener menos archivos también acelera enormemente la E / S del sistema de archivos, especialmente en sistemas de archivos montados en NFS. Siempre alquilo mis antiguos directorios de trabajo cuando finalizo un proyecto, ya que cuantos menos archivos tenga, los programas más rápidos
find
funcionarán.Hay una gran respuesta en Super Usuario que entra en más detalles, pero además de lo anterior, las otras razones básicas por las
tar
que todavía es popular hoy en día son:Eficiencia: usar
tar
para canalizar a través de un programa de compresión comogzip
es más eficiente ya que evita la creación de archivos intermedios.tar
viene con todo tipo de campanas y silbatos, características que han sido diseñadas a lo largo de su larga historia que lo hacen particularmente útil para las copias de seguridad * nix (permisos de pensar, propiedad de archivos, la capacidad de canalizar datos directamente a STDOUT y a través de un enlace SSH ... )Inercia. Estamos acostumbrados a
tar
. Es seguro asumir que estará disponible en cualquier * nix que pueda utilizar, lo que lo hace muy portátil y útil para los tarballs de código fuente.1 Esto es absolutamente cierto y no tiene nada que ver con el hecho de que no sé lo suficiente sobre ellos para explicar :)
fuente
tar
para "reducir la cantidad de archivos", ya que a la mayoría de los sistemas de archivos francamente no me importa, y de todos modos no es realmente óptimo yatar
que no admite un acceso aleatorio fácil a los archivos. Más bien, el uso principal (para mí y creo que para la mayoría de las personas) es compartir archivos (por ejemplo, código fuente) con otras personas de una manera simple.ARG_MAX
, esto puede hacer que lidiar con sus archivos de cualquier manera sea una molestia y, de hecho, puede generar una red (mal) configurada donde los archivos se almacenan en un servidor central y se comparten con NFS. En cuanto a reducir el número de archivos en general, necesitará muchos más archivos que eso para notar, pero en configuraciones de múltiples usuarios, el número de inodos puede llegar a ser limitante.tune2fs -l
en la partición que contiene mi $ HOME me dice que tengo 19,300,352 inodes. No podré crear más archivos que eso. Como dijiste, 10 ^ 6 no es una locura, ni siquiera en los rangos más altos realmente. Dependiendo de lo que esté haciendo, puede necesitar mucho más que eso.Hay dos tareas distintas pero relacionadas. El empaquetado de un árbol de archivos (incluidos los nombres de archivo, la estructura de directorios, los permisos del sistema de archivos, la propiedad y cualquier otro metadato) en una secuencia de bytes se denomina archivado . Eliminar la redundancia en una secuencia de bytes para producir una secuencia de bytes más pequeña se denomina compresión .
En Unix, las dos operaciones están separadas, con herramientas distintas para cada una. En la mayoría de las otras plataformas (actuales e históricas), las herramientas combinadas realizan el archivado y la compresión.
(gzip y otros programas que imitan la interfaz de gzip a menudo tienen la opción de almacenar el nombre de archivo original en la salida comprimida, pero esto, junto con un CRC u otra verificación para detectar la corrupción, son los únicos metadatos que pueden almacenar).
Hay ventajas en separar la compresión del archivo. El archivado es específico de la plataforma (los metadatos del sistema de archivos que necesitan preservarse varían ampliamente), pero la implementación es sencilla, en gran medida vinculada a E / S, y cambia poco con el tiempo. La compresión es independiente de la plataforma, pero las implementaciones están vinculadas a la CPU y los algoritmos mejoran constantemente para aprovechar los mayores recursos que el hardware moderno puede aportar al problema.
El archivador de Unix más popular es
tar
, aunque existen otros comocpio
yar
. (Los paquetes de Debian sonar
archivos, mientrascpio
que a menudo se usan para discos RAM iniciales). Se combinatar
o se ha combinado a menudo con herramientas de compresión comocompress
(.Z),gzip
(.gz),bzip2
(.bz2) yxz
(.xz), desde la más antigua hasta la más joven. , y no casualmente de peor a mejor compresión.Hacer un
tar
archivo comprimido y comprimirlo son pasos distintos: el compresor no sabe nada sobre eltar
formato del archivo. Esto significa que extraer un solo archivo de untar
archivo comprimido requiere descomprimir todos los archivos anteriores. Esto a menudo se llama un archivo "sólido".Del mismo modo, dado que tar es un formato de "transmisión", necesario para que sea útil en una tubería, no hay un índice global en un archivo tar, y enumerar el contenido de un archivo tar es tan costoso como extraerlo.
Por el contrario, Zip y RAR y 7-zip (los archivadores más populares en las plataformas modernas de Windows) generalmente comprimen cada archivo por separado, y comprimen los metadatos ligeramente si es que lo hacen. Esto permite una lista barata de los archivos en un archivo y la extracción de archivos individuales, pero significa que la redundancia entre múltiples archivos en el mismo archivo no puede ser explotada para aumentar la compresión. Si bien, en general, comprimir un archivo ya comprimido no reduce aún más el tamaño del archivo, ocasionalmente puede ver un archivo zip dentro de un archivo zip: la primera compresión convirtió muchos archivos pequeños en un archivo grande (probablemente con la compresión desactivada), que el segundo comprimir y luego comprimir como una sola entidad.
Existe una polinización cruzada entre las diferentes plataformas y filosofías:
gzip
es esencialmentezip
el compresor sin su archivador, yxz
es esencialmente7-zip
el compresor sin su archivador.Hay otros compresores especializados. Las variantes de PPM y su sucesor
ZPAQ
están optimizadas para una compresión máxima sin tener en cuenta el consumo de recursos. Pueden masticar fácilmente tanta CPU y RAM como pueda arrojarles, y la descompresión es tan exigente como la compresión (por el contrario, las herramientas de compresión más utilizadas son asimétricas : descomprimir es más barato que comprimir).En el otro extremo del espectro,
lzo
,snappy
yLZ4
son compresores de "luz", diseñado para una máxima velocidad y mínimo consumo de recursos, a costa de compresión. Son ampliamente utilizados en sistemas de archivos y otros almacenes de objetos, pero no tanto como herramientas independientes.Entonces, ¿cuál debes elegir?
Archivado:
Dado que está en Ubuntu, no hay ninguna razón real para usar otra cosa que no sea el
tar
archivado, a menos que esté tratando de crear archivos que sean fácilmente legibles en otro lugar.zip
es difícil de superar por la ubicuidad, pero no está centrado en Unix y no mantendrá los permisos del sistema de archivos y la información de propiedad, y su compresión integrada es anticuada. 7-zip y RAR (y ZPAQ) tienen una compresión más moderna pero no son adecuados para archivar sistemas de archivos Unix (aunque no hay nada que le impida usarlos solo como compresores); RAR también es propietario.Compresión:
Para obtener la máxima compresión, puede echar un vistazo a un punto de referencia, como el enorme en http://mattmahoney.net/dc/text.html . Esto debería darle una mejor idea de las compensaciones involucradas.
Sin embargo, probablemente no desee la máxima compresión. Es muy caro.
xz
es la herramienta de compresión de uso general más popular en los sistemas Unix modernos. Creo que 7-zip también puede leer archivos xz, ya que están estrechamente relacionados.Finalmente: si está archivando datos para algo que no sea almacenamiento a corto plazo, debe elegir algo de código abierto y preferiblemente extendido, para minimizar los dolores de cabeza más adelante.
fuente
lzo, gz, b2, lzma (.lzma2 =.xz)
son compresores de "flujo": comprimen un flujo de byes y no saben y no les importan los archivos, directorios y metadatos como los permisos. Debe usar un archivador como tar para agrupar todos esos datos en una secuencia de bytes (un archivo tar) y comprimirlos con un compresor. Si lo que le interesa son los datos de un solo archivo, también puede alimentar ese archivo solo a uno de estos compresores.Tar, cpio and pax
son archivadores: toman un montón de archivos y directorios y codifican los datos y metadatos en un solo archivo. El alquitrán es el más popular y más compatible, aunque los méritos técnicos entre los tres son lo suficientemente mínimos como para que haya guerras religiosas al respecto en los albores del tiempo.7z y zip son compresores Y arcihvers: luego almacene todos los datos y metadatos y comprímalos. Sin embargo, AFAICT, ninguno de ellos guarda los permisos de Unix.
Zip usa el mismo algoritmo que gzip llamado DEFLATE. 7z usa el algoritmo lzma
para leer un solo archivo de un tar.gz o similar, deberá descomprimir toda la secuencia gz hasta que se exponga la cantidad suficiente del archivo tar para poder extraerlo. Zip le permite comprimir y extraer cada archivo individualmente. 7z puede tener cualquier comportamiento.
Relaciones y velocidades de compresión: gzip y lzo tienen velocidades de compresión y descompresión muy muy rápidas pero bajas relaciones de compresión. Tampoco se necesita mucha memoria para comprimir. gzip es un poco más lento y ofrece una mejor relación de compresión que lzo.
Es tan rápido que puede ser más rápido leer un archivo comprimido gz o lzo del disco y descomprimirlo sobre la marcha en lugar de leer el archivo sin comprimir directamente del disco.
LZMA (xz) proporciona una excelente compresión en los datos generales, pero lleva mucho tiempo comprimir y descomprimir, además de requerir una cantidad significativa de memoria para comprimir.
bz2 solía ser el algoritmo de elección de alta compresión, pero cayó en desgracia, ya que es más lento que lzma y lleva más tiempo comprimir y descomprimir. Sin embargo, para ciertos tipos de datos (secuencias de ADN, archivos con ejecuciones muy grandes del mismo byte, etc.) bzip2 puede vencer a todo lo demás. Como ejemplo, una vez tuve que comprimir un archivo de 4GB de 1's y b2 redujo i a unos 10's de kb mientras que lzma tomó unos 10's de MB si no recuerdo mal.
fuente
Para archivos especialmente grandes, puede usar
rzip
. Primero analiza los datos redundantes dentro de bloques grandes de 900 MB, los codifica y luego los entrega a bzip2 (en realidad no, pero se utilizan los mismos algoritmos).¿Efecto? Mucho más rápido que
xz
,lzma
obzip2
, y en mi experiencia, su relación de compresión rivaliza con la delzma
. Sin embargo, es un cerdo RAM.http://en.wikipedia.org/wiki/Rzip
fuente