Empaquetado y compresion de archivos en GNU/Linux

Publicado por Diego Córdoba en

Hoy hablaremos de algunas herramientas interesantes y sumamente útiles para poder trabajar con archivos, empaquetado y compresión en sistemas GNU/empaquetado y compresionLinux.

Cabe aclarar que aquí tenemos dos tipos de archivos. Los paquetes, que son, sin ir más lejos, archivos que contienen archivos, pero que no utilizan ningún tipo de compresión. Y por otro lado, los archivos comprimidos, que representan la compresión, utilizando diferentes algoritmos, de un archivo común.

Luego, también se suelen combinar ambos para poder comprimir grupos de archivos, creando primero un paquete de archivos, y luego comprimiéndolo.

Los formatos principales de empaquetado

En GNU/Linux, como siempre, tenemos muchas alternativas para cada tarea. En el caso particular de este post, trabajaremos con lo que consideramos los formatos más difundidos en el ambiente: gz y bz2 como archivos comprimidos, y tar como paquete de archivos.

Comprimiendo archivos con gzip.

Supongamos que quisiéramos comprimir un archivo llamado «archivo_plano».
El primero comando que veremos es gzip. gzip es una utilidad gzdel sistema operativo que nos permite generar archivos de formato gz comprimidos, con solo llamar al comando y pasarle por argumento el archivo a comprimir.

gzip archivo_plano

Este comando comprimirá al archivo_plano y lo reemplazará por archivo_plano.gz, su representación comprimida en formato gzip.

Si quisiéramos comprimir un directorio en forma recursiva, deberíamos utilizar el modificador «-r» de la siguiente forma:

gzip -r /ruta/al/directorio/

Este comando comprime archivo por archivo, es decir, a diferencia del conocido zip, o rar, gzip no comprime directorios en un solo archivo, sino que comprime archivo por archivo interior, y reemplaza a cada uno por su equivalente comprimido.

Una opción interesante para analizar datos de compresión del archivo gz es la opción -l, como puede verse a continuación:

die@tuta2:/tmp$ gzip -l archivo_plano.gz
compressed uncompressed ratio uncompressed_name
962 2012 53.8% archivo_plano

Si quisieramos descomprimir el archivo gz generado, podremos hacerlo de dos formas. Una de ellas es utilizar el comando gzip con el modificador «-d», y la otra es usar un alias del comando, llamado gunzip:

gzip -d archivo_plano.gz

o

gunzip archivo_plano.gz

Comprimiendo archivos con bzip2

bzip2 es empaquetado y compresionotra utilidad de compresión de archivos que posee una relación de compresión mayor que la de gzip, es decir, los archivos comprimidos en formato bz2 son, por lo general, más pequeños que los archivos gz.
bzip2 utiliza como extensión .bz2 y, al igual que gzip, reemplaza al archivo original con el archivo comprimido.

Veamos un ejemplo:

bzip2 archivo_plano

Esto generará un arclivo comprimido llamado archivo_plano.bz2.

Para poder descomprimirlo, podemos utilizar, al igual que con gzip, el modificador «-d», o el alias del comando de descompresión de la siguiente manera:

bzip2 -d archivo_plano.bz2

o

bunzip2 archivo_plano.bz2

De cualquiera de las dos formas obtendremos el archivo plano original.

Empaquetando archivos con tar

Hasta ahora vimos cómo comprimir archivos individuales, pero también resulta una necesidad, principalmente por una cuestión de distribución o tareas de compartir archivos, generar un solo archivo comprimido que contenga un directorio completo, o una serie de archivos, en un solo paquete.empaquetado y compresion

Esto es posible empaquetando archivos, y luego comprimiéndolos como hemos visto.

El comando tar nos permite empaquetar archivos in compresión nativa, para luego trabajar ese archivo empaquetado como quisiéramos.

Supongamos que tenemos un directorio llamado dir_plano y quisiéramos generar un paquete tar del mismo. Podríamos hacerlo de la siguiente manera:

tar -cvf dir_plano.tar /ruta/al/dir_plano/

Esto tenerará en el directorio local, el archivo dir_plano.tar, que se un paquete de archivos que contendrá todo el contenido del directorio original pasado por argumento.

El modificador «-c» es para crear el archivo paquete, «-v» le indica que utilizamos el modo verbose, o explicativo, con la intención de que nos muestre, en la medida en que va empaquetando los archivos, el progreso o qué archivo está empaquetando en cada momento. El modificador «-f» nos permite especificarle un nombre de archivo para el paquete.tar, que podrá contener también una ruta en la que quisiéramos que se genere.

Podemos ver el contenido del paquete utilizando el modificador «-t» de la siguiente forma:

tar -tf dir_plano.tar

Y nos mostrará por pantalla todo el contenido, en archvos, directorios y subdirectorios, del paquete tar.

Para desempaquetar archivos tar podemos cambiar la opción «-c» por «-x», y de esta forma estaremos extrayendo el contenido del paquete en el directorio actual.

En nuestro ejemplo:

tar -xvf dir_plano.tar

Generará en el directorio actual un directorio dir_plano con todo el contenido original.

Empaquetando y comprimiendo

Por lo que hemos visto hasta ahora, podremos empaquetar una serie de archivos utilizando tar, y luego comprimirlos con gzip o bzip2.empaquetado y compresion

Si tenemos el directorio plano, podríamos generar un archivo comprimido con todo su contenido de esta forma:

tar -cvf dir_plano.tar dir_plano/

gzip dir_plano.tar #generara un archivo dir_plano.tar.gz

bzip dir_plano.tar #generara un archivo dir_plano.tar.bz2

y podremos compartir dicho archivo comprimido sin problemas!

El destinatario podrá descomprimirlo y desempaquetarlo usando en dos pasos de esta forma:

gunzip dir_plano.tar.gz

bunzip2 dir_plano.tar.gz

para obrener el archivo tar original, de acuerdo al mecanismo que hayamos usado para comprimir, y luego desempaquetar el tar de esta forma:

tar -xvf dir_plano.tar

para obtener el directorio original.

Tar para empaquetar y comprimir

Tar también permite comprimir utilizando a gzip o bzip2 como compresores/descompresores, de modo que podríamos tener en un solo comando toda la funcionalidad anterior.

Si disponemos del directorio plano dir_plano y quisiéramos armar un tar.gz directamente, podríamos hacer:

tar -cvzf dir_plano.tar.gz dir_plano/

De esta forma tar estará generando el paquete tar, y a su vez, con la opción «-z», comprimiéndolo usando gzip.

Lo mismo es aplicable a bzip2 con la opción «-j» de esta forma:

tar -cvjf dir_plano.tar.bz2 dir_plano/

Y para descomprimir solo bastará reemplazar la opción «-c» por «-x» como los casos anteriores. Descomprimiendo:

tar -xvzf dir_plano.tar.gz  #desempaqueta el gz con la opción -z

tar -xvjf dir_plano.tar.bz2 #desempaqueta el bz2 con la opción -j

Fácil no?

Ahora cuando vayamos a enviar una serie de archivos por mail, o cuando descrguemos algun codigo fuente empaquetado, podremos ver y acceder a su contenido con una serie de simples comandos de terminal.

Las extensiones de archivos y los «tarball’s»

Las extensiones .tar.gz y .tar.bz2 pueden ser reemplazadas, o pueden encontrarse en archivos descargados, por sus formas resumidas .tgz y .tbz respectivamente, e incluso nosotros podremos utilizarlas para nuestro comando tar.empaquetado y compresion

Por otro lado, tanto a los archivos .tar, como a los comprimidos .tar.gz (o .tgz) y .tar.bz2 (o .tbz), son llamados en la jerga, como «tarball», de modo que cuando decimos «descargamos un tarball», «enviamos un tarball», estamos haciendo referencia a un archivo empaquetado y/o comprimido usando éstas herramientas.

Conclusiones

Hemos visto dos de los comandos de compresión más utilizados en el mundo Linux, y tar, el súper comando de empaquetado y compresión.

Estas herramientas tienen otros modificadores que las hacen más potentes aún. Además, tar permite trabajar con otros formatos de compresión, como lzma o xz, para lo cual, por ejemplo, podremos utilizar la opción «-J» en la compresión/empaquetado y descompresión/desempaquetado.

¿Cómo saber más?

La respuesta es: #RTFM 😛

man gzip

man bzip2

man tar

Espero que les resulte de utilidad este tutorial!

¿Usás habitualmente otros compresores y empaquetadores? No dudes en comentarlo al pié de este artículo para enriquecer el contenido! Gracias!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador