Compresión y empaquetado con GZIP y TAR, ejemplos prácticos

por | octubre 31, 2015

A la hora de comprimir ficheros en UNIX y GNU/Linux tenemos varias utilidades de las que echar mano: bzip2, gzip, zip, compress… En particular prefiero utilizar gzip. No es el más óptimo en cuanto a compresión pero sí el que tiene mejor relación entre calidad, velocidad y uso de recursos durante compresiones y descompresiones. Por supuesto existen interesantes benchmarks que pueden ayudarnos a la hora de elegir una utilidad según las necesidades que tengamos. También cabe aclarar desde el principio que gzip y tar no son lo mismo. El primero es un compresor, mientras que el segundo es un empaquetador/archivador de ficheros.

Vamos a ver algunos ejemplos para comprimir con gzip y de empaquetado de archivos con tar:

#Comprimir un fichero access_log

gzip access_log

#Comprimir varios ficheros: access_log, error_log y ssl_access

gzip access_log error_log ssl_access

#Comprimir al máximo un fichero access_log (gzip admite 9 niveles 
#de compresión)

gzip -9 access_log

# Ver el nivel de compresión aplicado

gzip -l fichero.gz

#Comprimir todos los ficheros recursivamente dentro de un directorio

gzip -r directorio

#Buscar ficheros con extensión “.log” con antigüedad superior a los 10 días
#y comprimirlos con gzip lo máximo posible.

find . -name '*.log' -type f -mtime +10 -exec gzip -9 {} \;

#Buscar ficheros no comprimidos con antigüedad superior a 10 días
#y comprimirlos lo máximo posible con gzip.

find . -not -name '*.gz' -type f -mtime +10 -exec gzip -9 {} \;

#Generar un comprimido de un fichero y a la vez mantener el original
#sin comprimir (útil para enviar sólo los comprimidos para análisis)

gzip -k fichero_1

#Descomprimir

gunzip fichero.gz

#Empaquetar un directorio con tar y comprimirlo (opción -z)

tar cvfz fichero.tar.gz directorio

#Ver contenido de un empaquetado tar comprimido con gzip

tar tvfz fichero.tar.gz

#Descomprimir y desempaquetar un tar comprimido con gzip

tar xvfz fichero.tar.gz

#Crear un empaquetado con tar y especificar el nivel de compresión de gzip
#Tendremos que exportar la variable de entorno GZIP

export GZIP=-9
tar cvfz fichero.tar.gz directorio

#Calcular el tamaño de un fichero tar.gz

tar -czf fichero.tar.gz | wc -c

Un nota sobre el nivel de compresión de gzip: como decía admite 9. El hecho de elegir uno u otro dependerá como es obvio de cuánto deseemos comprimir, siempre teniendo en cuenta que a mayor nivel, mayor consumo de recursos a la hora de comprimir/descomprimir, especialmente de CPU ya que son operaciones bastante intensivas en ese sentido.

¿Cómo realizar operaciones sobre ficheros comprimidos?

Imaginemos que queremos hacer un grep o cat de un fichero comprimido. En tal caso tendríamos que descomprimirlo antes… si no fuera porque tenemos utilidades para trabajar sin tener que hacerlo. Seguro que ya las conoces sin el prefijo “z”:

zcat
zgrep
zdiff
zmore
zless
zcmp

En cada caso, la función es la misma que la del comando sin prefijo. Por ejemplo, con zcat podremos ver el contenido de un fichero comprimido:

zcat access_log.gz

O para buscar un patrón:

zgrep “192.168.2.134” access_log.gz

Todos los ejemplos anteriores de gzip/tar los tenéis en su gist correspondiente de GitHub donde los he subido.