Compresión de ficheros bzip2, gzip, xz y zip en GNU/Linux
La compresión de ficheros consiste en reducir el espacio que ocupa, o pesa, un determinado fichero. Esto es importante tanto para reducir el espacio que ocupará en disco, como para reducir la cantidad de datos que se enviarán por la red, optimizando la transmisión.
Para conseguir nuestro objetivo utilizaremos las herramientas tar, bzip2, gzip, xz y zip.
Sumario
- Como funciona la compresión
- Tipos de compresión
- Las herramientas de compresión y archivo
- Sistemas de compresión
- Herramientas de compresión
- bzip2, gzip y xz
- Niveles de compresión
- Herramientas de archivo
- Ficheros zip
Como funciona la compresión
La compresión de ficheros es utilizada, generalmente, para reducir el espacio de almacenamiento o reducir el tamaño de los ficheros a transmitir por la red. Pero ¿como funciona?.
Básicamente consiste en el reemplazo de patrones repetitivos en los datos. Los algoritmos de compresión buscan patrones en el texto de un documento, como por ejemplo la preposición «de», la más usada en español. Para reducir el tamaño del documento significativamente, se reemplaza esta palabra y sus patrones comunes por un solo caracter, generalmente un caracter del alfabeto griego que no se usa en el resto del texto.
Podemos afirmar que los algoritmos de compresión tratan los datos de manera similar, pero de una forma más compleja.
Tipos de compresión
Los tipos de compresión a aplicar tienen que ver con el tipo de fichero a tratar. Según esto, establecemos los tipos de compresión en dos grupos.
Compresión sin pérdida «lossless» y compresión con pérdida «lossy».
La información contenida en un fichero comprimido con un algoritmo «lossless», podemos descomprimirla sin pérdida alguna, en su forma original.
No es el caso de los ficheros comprimidos con un algoritmo «lossy», ya que los datos reducidos para la compresión, no pueden ser recuperados. Este tipo de compresión se utiliza para imágenes, video y audio, donde la pérdida de calidad no es perceptible para los humanos, es irrelevante para el contexto, o es importante para optimizar el rendimiento de la red.
Por ejemplo, en un fichero de audio, si eliminamos las frecuencias de sonido que no son perceptibles por el oído humano, reducimos el peso del fichero sin que notemos diferencia alguna en la reproducción. O reduciendo el número de colores de un fichero de imagen.
Las herramientas de compresión y archivo
En los sistemas GNU/Linux, se suelen utilizar las herramientas de archivo y compresión conjuntamente.
Las «archiving tools», o herramientas de archivo, se utilizan para agrupar ficheros y directorios en un único fichero y aumentar la eficiencia en las copias de seguridad o en la agrupación del código fuente.
La herramienta de archivo más común en sistemas GNU/Linux es «tar», que ya hemos visto en este blog «Compress, un programa para hacer paquetes tar».
Esta herramienta, por sí sola, únicamente crea un fichero que agrupa otros ficheros y directorios, y la tenemos disponible en la gran mayoría de distribuciones. Normalmente estos paquetes de datos, después se comprimen creando un «tarball».
Sistemas de compresión
Encontramos muchas herramientas de compresión en los sistemas UNIX, las más utilizadas son bzip2, gzip, y xz. Las tenemos disponibles en casi todos las distribuciones, aunque pueden existir sistemas antiguos o mínimos donde xz o bzip no estén instalados.
Los usuarios de sistemas GNU/Linux utilizamos las tres herramientas, según convenga. Las tres usan algoritmos diferentes, por lo que un fichero comprimido con una herramienta no puede ser descomprimido por otra diferente.
También nos permiten establecer diferentes niveles de compresión, pero hay que tener en cuenta que, a mayor compresión, más tardará el proceso de compresión y descompresión, al requerir mayor tiempo de procesamiento la búsqueda de patrones más complejos.
Estas herramientas libres, no están disponibles para los sistemas MSWindows. En estos sistemas, las herramientas de archivo y compresión están juntas, más adelante las veremos (zip y unzip). De todas formas será una cuestión a tener muy en cuenta si tenemos sistemas GNU/Linux y MSWindows que necesiten compartir ficheros.
Para facilitar las cosas, aunque la mayoría de los sistemas no tienen zip y unzip instaladas, las podemos instalar desde los repositorios fácilmente.
Herramientas de compresión
Cuando comprimimos un fichero, la cantidad de espacio en disco que ahorraremos dependerá de varios factores, la naturaleza de los datos que se comprimen, el algoritmo utilizado para comprimir los datos y el nivel de compresión. Pero no siempre podremos establecer diferentes niveles de compresión, ya que no todos los algoritmos los implementan.
bzip2, gzip y xz
Vemos unos casos prácticos para ver su uso y compararlos. Creamos unos directorios para pruebas, y unos ficheros.
mkdir ~/CompresionPruebas cd /CompresionPruebas mkdir Compresion Archivo cd Compresion
Y un fichero del que hacemos tres copias.
cat /etc/* > FichGrande 2>/dev/null cp FichGrande FichGrande2 cp FichGrande FichGrande3 cp FichGrande FichGrande4
Vemos que la sintaxis de las herramientas es la misma. Comprimimos cada fichero con una herramienta…
bzip2 FichGrande2 gzip FichGrande3 xz FichGrande4
Observamos la salida del comando «ls -lh» y vemos el tamaño inicial del fichero «FichGrande» sin comprimir. También comprobamos que cada herramienta ha añadido una extensión al nombre del fichero, lo que nos permite identificarlas, y que el fichero original, en cada caso, ha sido borrado.
Ahora que las hemos identificado podemos comprobar el nivel de compresión de cada una de ellas.
Para el proceso de descompresión tenemos que ejecutar los siguientes comandos, en cada caso.
bunzip2 FichGrande2.bz gunzip FichGrande3.gz unxz FichGrande4.xz
Comprobamos que el tamaño de los ficheros es el mismo. No hay pérdida. Y los ficheros iniciales comprimidos han sido borrados.
Niveles de compresión
Algunas de estas herramientas nos permiten establecer diferentes niveles de compresión. Un nivel más alto de compresión requerirá más tiempo de procesador y más memoria, pero el resultado es un fichero más pequeño. Lo vemos con unos ejemplos con las herramientas xz y gzip.
gzip
Utilizamos un nivel 1 y 9 de compresión con gzip
cp FichGrande FichGrande-gz1 cp FichGrande FichGrande-gz9 gzip -1 FichGrande-gz1 gzip -9 FichGrande-gz9
xz
Utilizamos un nivel 1 y 9 de compresión con xz
cp FichGrande FichGrande-xz1 cp FichGrande FichGrande-xz9 xz -1 FichGrande-xz1 xz -9 FichGrande-xz9 ls -lh
No es necesario descomprimir un fichero comprimido cada vez que se necesite. Las herramientas de compresión, normalmente incluyen versiones de herramientas estandar para leer ficheros de texto, por ejemplo gzip dispone de una versión de cat, grep, diff, less, more, etc…, solo hay que añadir el prefijo.
- gzip, utilizan el prefijo z
- bzip2, utilizan el prefijo bz
- xz, utilizan el prefijo xz
Para ver el contenido de un fichero comprimido con gzip, utilizamos la herramienta zcat. Le paso el filtro head para que muestre las 20 primeras líneas.
zcat FichGrande-gz1.gz
Herramientas de archivo
Ya hemos definido lo que hace una herramienta de archivo. En los sistemas GNU/Linux, la más utilizada es tar, abreviatura de «tape archive», por ello los ficheros resultantes se llaman «tarball». En este formato se suele distribuir el código fuente de los programas.
El comando tar tiene muchas opciones que podemos explorar ejecutando
man tar
Vemos su funcionamiento con unos ejemplos prácticos, siguiendo con la estructura de directorios creada. Ejecutamos el comando, indicando como primer argumento, el nombre del fichero a crear, y los demás argumentos con los ficheros a incluir después.
cd ~/CompresionPruebas/Compresion ls tar -czvf NuevoPaquete.tar.gz FichGrande2 FichGrande3 FichGrande4
En la salida nos indica los ficheros incluidos. Nos ha creado «NuevoPaquete.tar.gz», y vemos que está archivado y comprimido
Con la opción -t vemos el contenido
tar -tf fichero
Y para desempaquetarlo, primero borramos los ficheros originales que están en el paquete
rm FichGrande2 FichGrande3 FichGrande4 tar -xzvf NuevoPaquete.tar.gz
Las opciones utilizadas son
- -c, –create, Para crearlo
- -x, –extract, Para extraer el contenido
- -z, –gzip, –gunzip, –ungzipz, Elegir la herramienta de compresión
- -v, –verbose, Para listar los ficheros procesados
- -f, –file, Para indicar el nombre del fichero
- -t, –list, Muestra el contenido de un fichero
Otras opciones interesantes
- -u, –update, Para añadir ficheros
- -w, –interactive, –confirmation, Nos pregunta confirmación de cada acción
La herramienta tar también nos permite elegir el algoritmo de compresión, llamando a alguna de las herramientas vistas, con las siguientes opciones.
- bzip2, opción -j
- xz, opción -J
- gzip, opción -z
Lo vemos con unos ejemplos. Utilizando las opciones antes vistas, usamos diferentes algoritmos.
cd ~/CompresionPruebas/Compresion ls -l tar -czvf FichGrande2.gz FichGrande2 tar -cjvf FichGrande3.bz FichGrande3 tar -cJvf FichGrande4.xz FichGrande4
Como vemos en la captura anterior, los ficheros .gz, .bz y .xz, tienen diferentes tamaños al ser comprimidos con diferentes algoritmos y se han añadido extensiones al nombre del fichero para identificarlo.
Ficheros zip
Como hemos comentado, los sistemas MSWindows, no disponen de aplicaciones para manejar ficheros .tar ni de las propias de sistemas GNU/Linux, para compresión de ficheros. Por ello si necesitas compartir ficheros en tu red con un sistema MSWindows, puedes utilizar una herramienta común como ZIP. Los ficheros .zip son similares a los .tar comprimidos.
Es posible que tengas que instalar zip y unzip en tu sistema GNU/Linux, pero las encontrarás en los repositorios de casi todas las distribuciones.
El uso es muy sencillo. Lo vemos.
cd ~/CompresionPruebas/Compresion ls -lh
Para empaquetar estos ficheros y comprimirlos, utilizamos zip como sigue
zip Fichero.zip FichGrande2 FichGrande3 FichGrande4
Se utiliza la opción -r para añadir recursividad y que se incluyan los subdirectorios. Para descomprimirlo, ejecuta
unzip Fichero.zip
Nos pregunta si queremos reemplazar el fichero existente o renombrarlo.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en pie de la página o desde aquí mismo.