comprimir-tar-lzma-xz

Como comprimir archivos con tar lzma y xz en linux (consola de comandos)

En otro artículo hablamos de cómo montar un sistema de backups con una raspberry pi, de forma que automáticamente se hagan las copias de seguridad, pero vamos a rizar el rizo viendo como podemos comprimir carpetas y archivos con tar y xz o lzma.

Voy a dar por sentado que sabes utilizar la consola de linux en modo superusuario o root, por lo que nos centraremos específicamente en los casos que quiero enseñarte.

Supongamos que necesitas comprimir un lote de archivos o carpetas agrupados en un mismo archivo, de forma que ocupe lo mínimo posible. Según las pruebas de rendimiento, a pesar de que son algo más lentos y consumen algo más de recursos, comprimir en lzma o xz nos puede dar el mejor rendimiento (los dos son similares), y harán que nuestros archivos ocupen lo mínimo mientras que estarán empaquetados en un tar.

Una de sus utilidades puede ser para hacer una copia de seguridad de carpetas de documentos, o incluso de páginas web enteras las cuales queramos guardar copias periódicas.

Cómo comprimir con tar y lzma o xz en un solo comando y la máxima compresión

Como la idea es que ocupe lo mínimo posible utilizaremos la máxima compresión, pero también si andas justo de recursos puedes utilizar los parámetros predeterminados que te permitirán aligerar un poco la carga a tu máquina.

En este caso vamos a trabajar sobre archivos de forma local, es decir, que si quieres hacerlo sobre archivos remotos te recomiendo que primero los descargues con rsync, y luego los comprimas para así también evitar sobrecargas en la máquina remota que tengas en producción.

El comando a ejecutar para empaquetar y comprimir una carpeta con tar y lzma sería el siguiente:

tar -cf - /var/carpeta/ --exclude=images  --exclude=cache | lzma -c -9 - > foo.tar.xz

Por otro lado el comando para empaquetar y comprimir una carpeta en tar y xz sería este:

tar -cf - /var/carpeta/ --exclude=images  --exclude=cache | xz -c -9 - > foo.tar.xz
  • Tar -cf – : es la parte que se encarga de indicar que queremos ejecutar tar para empaquetar un archivo o carpeta
  • /var/carpeta/: será la carpeta del origen de los datos, la que queremos comprimir
  • –exclude=images  –exclude=cache: esto serían exclusiones que no queremos comprimir, por que sean datos que no nos hacen falta
  • | : separador para enviar lo que ejecutamos antes a lo que queramos ejecutar después.
  • lzma o xz -c -9 – : comando xz que va a ejecutar la compresión en este formato. Si quieres dejarlo predeterminado si te de error de memoria insuficiente simplemente borra el -9 (el predeterminado es -6).
  • > foo.tar.xz : el comando mayor indica donde queremos colocar el contenido y foo.tar.xz será el nombre que queramos dar al archivo comprimido.
Léete también  Cómo crear simlinks y hardlinks en Windows 10

Hay partes que podemos omitir, como por ejemplo las exclusiones, o el -9 que indica el nivel de compresión del xz. Con eliminarlos del comando será más que suficiente.

Cómo excluir archivos al usar tar

Esta es una parte que me parece interesante, además de que hay mucha información ambigua e imprecisa en internet. Tenemos varias formas de excluir archivos y carpetas, algunos nos serán más útiles que otros, pero el problema podría ser que tenemos definirlos todos en el comando, pero en la última opción te voy a explicar cómo excluir archivos en tar con un archivo de exclusiones.

Excluir carpetas y archivos en concreto

El primer caso será evitar comprimir archivos y carpetas que tengan un nombre determinado. Con este comando lo podemos hacer de forma sencilla:

tar --exclude=cache

De esta forma no se comprimirán ningún archivo ni carpeta que se llame cache. Debes tener en cuenta que si quieres indicar un archivo con extensión deberás hacerlo así

tar --exclude='file.ext'

ya que de lo contrario no coincidirá y se comprimirá igualmente.

Excluir archivos y carpetas con expresiones regulares

De esta forma podremos hacer coincidir por ejemplo diferentes nombres de archivos para una extensión en concreto, o incluso partes de los nombres de archivos o carpetas:

tar --exclude='*.jpg'

tar --exclude='*cache*'

En el primer caso omitirá todos los archivos .jpg, en el segundo todas las rutas completas y nombres de archivo que contengan cache.

Excluir una ruta en concreto

Por último, podemos especificar la exclusión de una ruta específica indicándola completamente:

tar --exclude=/mi/ruta/carpeta

Fíjate que al principio de la misma he puesto /, esta ruta hará referencia a la ruta completa desde la carpeta root donde se encuentre la que vamos a empaquear en el sistema, por ejemplo si estás empaquetando en /var/hdd tendrás que poner /var/hdd/mi/ruta/carpeta.

Léete también  Qué es Ansible y por qué deberías empezar a usarlo si administras servidores

Excluir archivos o carpetas desde una lista

Por último tenemos la opción de, en caso de querer excluir varios archivos y carpetas diferentes en tar, usar un archivo con una lista de ellos para evitar repetir el comando –exclude y que nos salga un comando larguísimo. De esta forma también podremos tenerlo más organizado y editarlo de forma más sencilla. El comando a ejecutar sería

tar –exclude-from=lista.txt

puedes llamar al archivo lista.txt como quieras, incluso sin usar extensión alguna mientras sea en texto plano. El archivo tendría que ser así:

fichero.txt
*.jpg
/var/hdd/carpeta
carpeta

Combínalos como quieras y hazte la lista con las exclusiones que quieras, solo recuerda que tiene que ser una por línea y debe estar en texto plano, puedes usar nano para crearlo o cualquier editor de texto.

¿Has tenido alguna duda? ¿Para qué lo has utilizado?


AYUDANOS a poder seguir dando respuestas. Te podemos echar una mano y tú también a nosotros, símplemente dale a me gusta.