Cuando empezamos a gestionar sistemas y servidores Linux, una de las primeras cosas que aprendemos por necesidad es a manejar archivos comprimidos. Ya sea para empaquetar backups de configuraciones, gestionar gigas de logs, o preparar imágenes de sistema, la terminal nos ofrece muchas opciones: tar, gzip, zip…
Hoy vamos a diseccionar los principales compresores, descubrir cómo sacarles el máximo partido exprimiendo nuestra CPU, y terminaremos montando un sistema de backup automatizado que nos avise por Telegram. ¡Vamos al lío!
En sistemas GNU/Linux existe una distinción fundamental que a menudo confunde a quienes empiezan: empaquetar no es comprimir.
- Empaquetar (Archivar): Consiste en juntar múltiples archivos y directorios (junto con sus permisos, propietarios y estructura de carpetas) en un único archivo continuo. El tamaño total casi no varía. El estándar indiscutible es
tar(Tape Archive). - Comprimir: Consiste en aplicar un algoritmo matemático a un único archivo para reducir el espacio que ocupa en disco. Herramientas nativas como
gzip,bzip2oxzsolo pueden comprimir un único archivo a la vez.
Por esta razón se combinan ambas tareas: primero se empaqueta una carpeta con tar y luego se pasa por el compresor (generando archivos .tar.gz, .tar.bz2 o .tar.xz).
1. El comodín del administrador: El comando tar
El comando tar permite empaquetar y comprimir en un solo paso gracias a que integra los motores de compresión directamente mediante modoles o flags.
Opciones (flags) principales de tar
- Operaciones básicas (elegir una):
-c(--create): Crea un nuevo archivo empaquetado.-x(--extract): Extrae el contenido de un archivo empaquetado.-t(--list): Lista el contenido del archivo sin extraerlo.
- Selección del algoritmo de compresión:
- (Sin flag): Solo empaqueta (
.tar). -z(--gzip): Filtra a través degzip(.tar.gzo.tgz).-j(--bzip2): Filtra a través debzip2(.tar.bz2).-J(--xz): Filtra a través dexz(.tar.xz).
- (Sin flag): Solo empaqueta (
- Modificadores esenciales:
-f(--file): Especifica el nombre del archivo de destino o lectura. Debe ser el último flag de la lista.-v(--verbose): Muestra el detalle del proceso en pantalla paso a paso.-C(--directory): Cambia a un directorio específico antes de realizar la extracción.-p(--same-permissions): Mantiene intactos los permisos de archivos y propietarios originales.--exclude=PATRÓN: Excluye archivos o carpetas que coincidan con el patrón indicado (ej.--exclude='.git').
Ejemplos prácticos con tar
# Empaquetar sin comprimir
tar -cvf backup.tar /var/www/html
# Empaquetar y comprimir con GZIP (rápido y ligero)
tar -czvf backup.tar.gz /var/www/html
# Empaquetar y comprimir con BZIP2 (ratio intermedio)
tar -cjvf backup.tar.bz2 /var/www/html
# Empaquetar y comprimir con XZ (compresión máxima)
tar -cJvf backup.tar.xz /var/www/html
# Extraer en el directorio actual (autodetecta el formato de compresión)
tar -xvf backup.tar.xz
# Extraer el contenido dentro de una carpeta concreta
tar -xvf backup.tar.gz -C /tmp/restauracion
# Listar contenido sin extraer
tar -tvf backup.tar.xz
2. Herramientas de compresión individuales: gzip, bzip2 y xz
Si trabajas con un solo archivo grande (por ejemplo, un volcado de base de datos .sql o una imagen .img), no necesitas tar. Puedes usar directamente los compresores.
¡Atención! Por defecto, estas herramientas eliminan el archivo original y dejan únicamente el comprimido, a menos que utilices el flag
-k(--keep).
gzip (GNU zip)
Es el estándar por su velocidad.
- Comprimir (conservando el original):
gzip -k archivo.txt - Descomprimir:
gunzip archivo.txt.gzogzip -d archivo.txt.gz - Niveles de compresión: Del
-1(ultra rápido, menos compresión) al-9(máxima compresión). Por defecto aplica-6.
bzip2
Ofrece mejor ratio que gzip a costa de usar más tiempo y CPU.
- Comprimir (conservando el original):
bzip2 -k archivo.txt - Descomprimir:
bunzip2 archivo.txt.bz2obzip2 -d archivo.txt.bz2
xz
Usa el algoritmo LZMA2. Ofrece el máximo ratio de compresión en Linux.
- Comprimir (conservando el original):
xz -k archivo.txt - Descomprimir:
unxz archivo.txt.xzoxz -d archivo.txt.xz - Uso de multinúcleo (Multithreading): Por defecto usa un solo hilo. Con
-T0utiliza todos los núcleos disponibles del procesador:
Bashxz -k -9 -T0 imagen_sistema.img
3. Intercambio con Windows/macOS: zip y unzip
A diferencia de los comandos nativos de Linux, zip empaqueta y comprime en el mismo paso y es el estándar universal para compartir archivos con otros sistemas operativos.
Comandos y flags principales
Para crear archivos .zip:
-r(--recurse-paths): Imprescindible para incluir subcarpetas recursivamente.-e(--encrypt): Solicita clave para cifrar el archivo.-9: Aplica compresión máxima.
# Comprimir una carpeta entera recursivamente
zip -r -9 archivo.zip /ruta/a/carpeta
# Comprimir y proteger con contraseña
zip -r -e seguro.zip /ruta/a/datos_sensibles
Para descomprimir .zip:
-l(--list): Muestra el contenido sin extraer.-d(--directory): Especifica la carpeta de destino.
# Extraer en una ruta específica
unzip archivo.zip -d /home/usuario/descargas/
4. Comparativa visual de rendimiento
A la hora de elegir la herramienta adecuada, hay que sopesar tres factores: Ratio de compresión, Velocidad y Consumo de recursos (CPU).
(A continuación se muestra la tarjeta comparativa global con las métricas fijas de cada herramienta):
📊 Comparativa de Compresores en Linux
5. Resumen rápido (Cheat Sheet)
| Tarea habitual | Comando recomendado |
| Empaquetar carpeta (sin comprimir) | tar -cvf salida.tar /carpeta |
Comprimir carpeta rápido (gzip) | tar -czvf salida.tar.gz /carpeta |
Comprimir carpeta máximo ahorro (xz) | tar -cJvf salida.tar.xz /carpeta |
Extraer cualquier .tar.* | tar -xvf archivo.tar.* |
Extraer .tar.* en carpeta específica | tar -xvf archivo.tar.* -C /ruta/destino |
| Comprimir un solo archivo conservándolo | xz -k -T0 archivo.log (o gzip -k, bzip2 -k) |
| Crear zip para Windows | zip -r archivo.zip /carpeta |
| Descomprimir zip en carpeta | unzip archivo.zip -d /ruta/destino |
🚀 Nivel Pro: Multihilo y Barras de Progreso
1. Exprimiendo la CPU: Compresión Multihilo
¿Por qué la compresión tradicional se siente «lenta»?
Los procesadores modernos (de un ordenador de sobremesa, un servidor o una Raspberry Pi) tienen varios núcleos o hilos (4, 8, 16 o más). Sin embargo, herramientas tradicionales como gzip, bzip2 o xz fueron creadas hace décadas, cuando los procesadores solo tenían un núcleo.
Por defecto, estos comandos solo utilizan 1 solo núcleo al 100%, dejando el resto de tu procesador totalmente ocioso. Si tienes un procesador de 8 núcleos y usas gzip, estás aprovechando apenas un 12,5% de la potencia total de tu máquina.
Las versiones multihilo al rescate
Para solucionar esto existen versiones paralelizadas (multihilo). Lo que hacen es dividir el archivo gigante en pequeños trozos, repartir cada trozo entre todos los núcleos de tu CPU para comprimirlos simultáneamente y luego juntarlos de nuevo.
| Herramienta clásica (1 núcleo) | Herramienta Multihilo (Todos los núcleos) |
gzip | pigz (Parallel Implementation of GZip) |
bzip2 | pbzip2 (Parallel BZIP2) |
xz | pixz (o xz -T0 nativo) |
Paso 1: Instalación
En la mayoría de distribuciones basadas en Debian, Ubuntu o Raspberry Pi OS, estas herramientas no vienen instaladas por defecto, pero se instalan con un solo comando:
sudo apt update
sudo apt install pigz pbzip2 pixz pv
Paso 2: Uso directo de los comandos multihilo
Funcionan con las mismas banderas básicas que ya conoces (-k para mantener el original, -d para descomprimir, -9 para máxima compresión):
# Comprimir un archivo usando TODOS los núcleos de la CPU con pigz
pigz -k -9 base_de_datos.sql
# Genera: base_de_datos.sql.gz (mucho más rápido que gzip)
# Descomprimir a máxima velocidad con pigz
pigz -d base_de_datos.sql.gz
# Comprimir con pbzip2 (repartiendo carga entre núcleos)
pbzip2 -k imagen.iso
Paso 3: Usar herramientas multihilo directamente con tar
Para que tar no use el gzip tradicional sino pigz, se utiliza el flag -I (o --use-compress-program=), indicándole a tar qué motor de compresión externo debe emplear:
# Empaquetar y comprimir una carpeta a la máxima velocidad posible usando pigz:
tar -I pigz -cvf backup_ultrarrapido.tar.gz /var/www/html
# Lo mismo para bzip2 multihilo (pbzip2):
tar -I pbzip2 -cvf backup.tar.bz2 /var/www/html
# Lo mismo para xz multihilo (pixz):
tar -I pixz -cvf backup.tar.xz /var/www/html
Nota para XZ: El comando
xzmoderno ya incluye soporte multihilo sin instalar nada extra. Solo debes pasarle el flag-T0para usar todos los núcleos disponibles:tar -I "xz -T0" -cvf backup.tar.xz /var/www/html
2. Barras de progreso en tiempo real con pv (Pipe Viewer)
Cuando comprimes un archivo o carpeta de varios Gigabytes desde la terminal, la pantalla se queda congelada sin mostrar si el proceso va por el 10% o el 90%, ni cuánto tiempo falta.
La herramienta pv (Pipe Viewer) intercepta el flujo de datos entre comandos (tuberías o pipes|) y muestra una barra de progreso en tiempo real con velocidad de transferencia, tiempo transcurrido y tiempo estimado de finalización (ETA).
[===> ] 12% 14.2MB/s ETA 0:04:32
Ejemplo 1: Ver el progreso al comprimir un solo archivo grande
En lugar de lanzar gzip archivo.iso, hacemos pasar el archivo a través de pv:
pv archivo.iso | pigz > archivo.iso.gz
- Explicación:
pvleearchivo.iso, muestra la barra de progreso en pantalla mientras lo pasa por la tubería|apigz, y el resultado se guarda enarchivo.iso.gz.
Ejemplo 2: Ver el progreso al empaquetar una carpeta con tar
Para ver la barra de progreso mientras empaquetas y comprimes una carpeta entera:
tar -cf - /var/www/html | pv | pigz > backup_con_progreso.tar.gz
tar -cf - /var/www/html: Empaqueta la carpeta y, en vez de crear un archivo en disco directamente, manda el resultado a la salida estándar (-).| pv |: Mide los datos que van pasando y dibuja la barra de progreso.| pigz > backup_con_progreso.tar.gz: Recibe el flujo, lo comprime usando todos los núcleos de la CPU y lo guarda finalmente en el archivo de destino.
Ejemplo 3: Ver el progreso al descomprimir
pv backup.tar.gz | pigz -d | tar -x
- Lee el comprimido mostrando la barra de progreso (
pv), lo descomprime en memoria con todos los núcleos (pigz -d) y lo extrae en el directorio actual (tar -x).
Conclusión: Pon tu disco duro a dieta
Ahora que ya conoces los entresijos del empaquetamiento y la compresión en la terminal de Linux, no hay archivo grande ni directorio pesado que se te resista. Al final, esto es como un gimnasio de alto rendimiento para tus datos: la clave no está en «sudar» CPU a lo loco, sino en elegir la rutina adecuada para cada caso:
- Si necesitas velocidad pura y cero esperas: Tira de
gzipo, mejor aún, desata toda la potencia multihilo conpigz. - Si el espacio en disco o el ancho de banda son sagrados: Dale caña con la mancuerna pesada de
xz(opixz) para arañar hasta el último megabyte. - Y no olvides la regla de oro: Empaquetar junta los archivos ordenadamente con sus permisos; comprimir los encoge.
Dominar estas herramientas y sus alternativas modernas marca la diferencia entre un administrador que se queda mirando una pantalla congelada y uno que optimiza recursos e infraestructura como un profesional.
En la próxima entrada daremos el paso definitivo: cogeremos todo este músculo de compresión multihilo y lo integraremos en un sistema de backups automatizado con Systemd y avisos directos al móvil por Telegram.
¿Cuál es tu combinación favorita en el día a día? ¿Eres más de primar la velocidad o de buscar el máximo ahorro de espacio? ¡Nos leemos en los comentarios!