32blogby StudioMitsu

Guía Práctica de tar, gzip y zip: Compresión Total en Linux

Domina tar, gzip, zip y zstd en Linux. Creación y extracción de archivos, comparación de algoritmos con benchmarks y patrones de automatización de backups.

14 min read
CLILinuxbashtarcompressionscripting
Contenido

tar agrupa archivos en un solo paquete. gzip, bzip2, xz y zstd comprimen ese paquete (o cualquier archivo individual) para ahorrar espacio. zip hace ambas cosas en un solo paso. Saber cuándo usar cada herramienta te ahorra backups hinchados, transferencias lentas y el clásico "no puedo abrir este archivo".

En resumen: usa tar czf archivo.tar.gz dir/ para crear un archivo comprimido con gzip, y tar xf archivo.tar.gz para extraerlo. Para mejor equilibrio velocidad/compresión, cambia a zstd con tar --zstd -cf archivo.tar.zst dir/. Usa zip solo cuando compartas archivos con usuarios de Windows o macOS que no usan la terminal.

Cómo Funcionan el Archivado y la Compresión

Esto me confundió al principio, así que voy directo al punto: archivar y comprimir son dos operaciones completamente distintas.

Archivar significa combinar múltiples archivos y directorios en un solo archivo. Eso es todo lo que hace tar — el nombre viene de "tape archive". El resultado es un archivo .tar (conocido como "tarball"), y tiene exactamente el mismo tamaño que los archivos originales combinados. No ahorra espacio.

Comprimir significa reducir el tamaño de los datos usando un algoritmo. Herramientas como gzip, bzip2, xz y zstd implementan diferentes algoritmos de compresión. Solo trabajan con un flujo de entrada — un archivo entra, un archivo comprimido sale.

La filosofía Unix las combina: tar crea un flujo a partir de múltiples archivos, y luego un compresor reduce ese flujo:

bash
# Enfoque en dos pasos (raramente lo harás manualmente)
tar cf proyecto.tar proyecto/
gzip proyecto.tar
# Resultado: proyecto.tar.gz

# Enfoque en un paso (esto es lo que usarás)
tar czf proyecto.tar.gz proyecto/

¿Por qué importa esta diferencia? Porque zip toma un enfoque fundamentalmente distinto — comprime cada archivo individualmente y luego los agrupa. Cuando tar.gz comprime todos los archivos como un solo flujo, puede aprovechar similitudes entre archivos. Por eso los archivos tar.gz son típicamente 5–15% más pequeños que los .zip equivalentes, especialmente en repositorios de código con muchos archivos similares.

Enfoque tar:  [file1][file2][file3] → tar → [un flujo] → gzip → .tar.gz
Enfoque zip:  [file1→gz][file2→gz][file3→gz] → agrupar → .zip

La otra cara: puedes extraer un archivo individual de un .zip sin descomprimir todo, mientras que .tar.gz requiere descomprimir el flujo completo.

Fundamentos de tar: Crear, Extraer y Listar Archivos

Los flags principales que usarás cada día:

FlagSignificado
cCrear un nuevo archivo
xExtraer de un archivo
tListar contenidos sin extraer
fEspecificar el nombre del fichero (casi siempre necesario)
vModo verboso — mostrar cada archivo procesado
zComprimir/descomprimir con gzip
jComprimir/descomprimir con bjip2
JComprimir/descomprimir con xz (J mayúscula)

Crear archivos

bash
# Tarball sin compresión
tar cf backup.tar documentos/

# Archivo comprimido con gzip
tar czf backup.tar.gz documentos/

# Archivo comprimido con xz (tamaño mínimo, más lento)
tar cJf backup.tar.xz documentos/

# Archivo comprimido con zstd (rápido + buena compresión)
tar --zstd -cf backup.tar.zst documentos/

Extraer archivos

GNU tar detecta automáticamente el formato de compresión desde la versión 1.15, así que no necesitas especificar -z, -j o -J al extraer:

bash
# Extraer cualquier archivo tar comprimido (detección automática)
tar xf backup.tar.gz
tar xf backup.tar.xz
tar xf backup.tar.zst

# Extraer en un directorio específico
tar xf backup.tar.gz -C /opt/restore/

# Extraer un solo archivo
tar xf backup.tar.gz documentos/informe.pdf

Listar contenidos

Siempre revisa el contenido antes de extraer — especialmente archivos de internet. He visto tarballs que extraen directamente en el directorio actual sin subdirectorio, sobrescribiendo todo lo que hay:

bash
# Listar todos los archivos
tar tf backup.tar.gz

# Mostrar información detallada (permisos, tamaños, fechas)
tar tvf backup.tar.gz

# Verificar si tiene un directorio raíz
tar tf backup.tar.gz | head -5

Excluir archivos

Aquí es donde tar brilla para backups de proyectos. Una vez incluí node_modules accidentalmente en un tarball — 800MB de archivo para un proyecto de 50KB:

bash
# Excluir directorios específicos
tar czf 32blog-backup.tar.gz \
  --exclude='node_modules' \
  --exclude='.next' \
  --exclude='.git' \
  32blog/

# Excluir por patrón
tar czf solo-fuentes.tar.gz \
  --exclude='*.log' \
  --exclude='*.tmp' \
  proyecto/

Añadir archivos a un archivo existente

Puedes añadir a archivos .tar sin comprimir (no a los comprimidos):

bash
# Añadir un archivo a un tar existente
tar rf backup.tar nuevo-archivo.txt

# Esto NO funciona con .tar.gz
tar rf backup.tar.gz nuevo-archivo.txt  # ¡Error!

Elegir un Algoritmo de Compresión: gzip, bzip2, xz y zstd

Cada algoritmo hace diferentes compromisos entre velocidad y ratio de compresión.

gzip — El estándar universal

GNU gzip lleva más de 30 años como herramienta de compresión estándar en Unix. La versión 1.14 (febrero 2025) añadió descompresión más rápida en CPUs x86-64 usando instrucciones PCLMUL.

bash
# Comprimir un archivo (reemplaza el original)
gzip access.log
# Resultado: access.log.gz

# Mantener el archivo original
gzip -k access.log

# Descomprimir
gunzip access.log.gz
# o
gzip -d access.log.gz

# Ajustar nivel de compresión (1=más rápido, 9=más pequeño, default=6)
gzip -9 access.log

Cuándo usarlo: scripts, rotación de logs, cualquier situación donde la compatibilidad es prioritaria. Todos los sistemas Unix tienen gzip.

bzip2 — Mejor ratio, mucho más lento

bash
tar cjf archivo.tar.bz2 proyecto/

Bzip2 comprime un 10–15% mejor que gzip pero es significativamente más lento. Ha sido superado por xz (mejor ratio) y zstd (mejor velocidad). Todavía encontrarás archivos .tar.bz2, pero hay poca razón para crear nuevos.

xz — Compresión máxima

XZ Utils produce consistentemente los archivos más pequeños. Los tarballs del kernel de Linux, paquetes de Debian y muchos proyectos open source se distribuyen como .tar.xz:

bash
# Comprimir con xz
tar cJf archivo.tar.xz proyecto/

# Compresión multi-hilo (xz es single-thread por defecto)
tar -cf - proyecto/ | xz -T0 > archivo.tar.xz

# Descomprimir
tar xf archivo.tar.xz

Cuándo usarlo: distribución de software, archivado a largo plazo donde el almacenamiento importa más que el tiempo.

zstd — La opción moderna

Zstandard (zstd) fue desarrollado en Facebook y se ha convertido rápidamente en la herramienta de compresión preferida. La versión 1.5.7 (febrero 2025) activa compresión multi-hilo por defecto, con un máximo de 4 hilos.

bash
# Crear un archivo comprimido con zstd
tar --zstd -cf archivo.tar.zst proyecto/

# Compresión zstd standalone
zstd -T0 archivo-grande.sql
# Resultado: archivo-grande.sql.zst

# Ajustar nivel (rango por defecto 1-19, --ultra para 20-22)
zstd -19 archivo-grande.sql
zstd --ultra -22 archivo-grande.sql  # Compresión máxima

# Descomprimir
zstd -d archivo-grande.sql.zst
unzstd archivo-grande.sql.zst

Cuando cambié de gzip a zstd para los backups del directorio de contenido de 32blog, el tiempo de compresión se redujo un 60% con un ratio de compresión ligeramente mejor. La única desventaja es que sistemas anteriores a 2019 podrían no tener zstd instalado.

Cuándo usarlo: cualquier proyecto nuevo donde controlas ambos extremos. Backups, artefactos CI/CD, dumps de bases de datos, imágenes de contenedores.

zip y unzip: La Opción Multiplataforma

zip es el formato que funciona en todas partes — Windows, macOS y Linux lo manejan nativamente. A diferencia del enfoque tar + compresor, zip archiva y comprime en un solo paso:

bash
# Crear un archivo zip
zip -r proyecto.zip proyecto/

# Ajustar nivel de compresión (0=sin compresión, 9=máxima)
zip -r -9 proyecto.zip proyecto/

# Excluir patrones
zip -r proyecto.zip proyecto/ -x "*.git*" "*/node_modules/*"

# Listar contenidos
unzip -l proyecto.zip

# Extraer
unzip proyecto.zip

# Extraer en directorio específico
unzip proyecto.zip -d /opt/restore/

# Extraer un solo archivo
unzip proyecto.zip "proyecto/config.json"

Archivos protegidos con contraseña

bash
# Crear zip encriptado (pide contraseña)
zip -er sensible.zip contratos/

# Extraer (pide contraseña)
unzip sensible.zip

Cuándo usar zip en lugar de tar.gz

  • Compartir archivos con usuarios de Windows o macOS que no usan terminal
  • Archivos Java .jar y .war (son archivos zip internamente)
  • Adjuntos de correo electrónico (zip es universalmente entendido)
  • Cuando necesitas acceso aleatorio a archivos individuales sin descomprimir todo

Para todo lo demás — backups, despliegues, archivado de datos — usa tar + tu compresor preferido.

Patrones Reales: Backups, Despliegues y Pipelines

Backups con timestamp

Un patrón que uso para el directorio de contenido de 32blog — cada backup lleva un timestamp para que no se sobrescriban:

bash
#!/usr/bin/env bash
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/backups"
SOURCE_DIR="/var/www/32blog"

tar --zstd -cf "${BACKUP_DIR}/32blog-${TIMESTAMP}.tar.zst" \
  --exclude='node_modules' \
  --exclude='.next' \
  --exclude='.git' \
  "${SOURCE_DIR}"

# Eliminar backups con más de 30 días
find "${BACKUP_DIR}" -name "32blog-*.tar.zst" -mtime +30 -delete

echo "Backup creado: 32blog-${TIMESTAMP}.tar.zst"

Transferencia remota por SSH (sin archivo intermedio)

Uno de mis patrones favoritos con tar — pasar directamente por SSH para transferir un directorio a otro servidor sin crear un archivo temporal. Más patrones SSH en la guía de ssh y rsync:

bash
# Copiar un directorio a un servidor remoto
tar czf - proyecto/ | ssh user@servidor "tar xzf - -C /opt/deploy/"

# Copiar de remoto a local
ssh user@servidor "tar czf - /var/log/app/" | tar xzf - -C ./logs/

# Con indicador de progreso (requiere pv)
tar cf - proyecto/ | pv | ssh user@servidor "tar xf - -C /opt/deploy/"

Dividir archivos grandes

Cuando necesitas transferir un archivo masivo pero tienes límites de tamaño (email, USB, o conexiones inestables):

bash
# Crear y dividir en partes de 100MB
tar czf - proyecto-grande/ | split -b 100M - backup-parte-

# Reunir y extraer
cat backup-parte-* | tar xzf -

Combinación con find

Combina tar con find y xargs para flujos de trabajo potentes:

bash
# Encontrar todos los .tar.gz y extraerlos
find /descargas -name "*.tar.gz" -exec tar xzf {} -C /opt/extraido/ \;

# Archivar solo archivos modificados en las últimas 24 horas
find proyecto/ -mtime -1 -type f -print0 | \
  tar czf cambios-recientes.tar.gz --null -T -

# Archivar solo tipos de archivo específicos
find src/ -name "*.ts" -o -name "*.tsx" | \
  tar czf fuentes-typescript.tar.gz -T -

Backups incrementales con tar

GNU tar soporta backups incrementales usando archivos de snapshot. La primera ejecución crea un backup completo; las siguientes solo respaldan archivos modificados:

bash
# Backup completo (crea archivo de snapshot)
tar --listed-incremental=snapshot.snar \
  -czf backup-completo.tar.gz proyecto/

# Backup incremental (solo cambios desde la última ejecución)
tar --listed-incremental=snapshot.snar \
  -czf backup-incr-$(date +%Y%m%d).tar.gz proyecto/

# Restaurar: aplicar backup completo primero, luego incrementales en orden
tar --listed-incremental=/dev/null -xzf backup-completo.tar.gz
tar --listed-incremental=/dev/null -xzf backup-incr-20260323.tar.gz

Comparación de Rendimiento: Velocidad vs. Ratio de Compresión

Hice benchmarks con estos algoritmos usando un proyecto web típico (el código fuente de 32blog — unos 180MB de código, contenido MDX y assets):

AlgoritmoFlag del comandoTamaño comprimidoVelocidad compresiónVelocidad extracción
gzip -1tar czf (rápido)~45MBMuy rápidaRápida
gzip -6tar czf (default)~38MBRápidaRápida
gzip -9tar czf (máximo)~37MBModeradaRápida
bzip2tar cjf~33MBLentaLenta
xz -6tar cJf~28MBMuy lentaModerada
zstd -3tar --zstd (default)~36MBMuy rápidaMuy rápida
zstd -19tar --zstd (alto)~29MBLentaMuy rápida
zip -6zip -r (default)~40MBRápidaRápida

Conclusiones clave:

  • zstd por defecto se acerca a la compresión de gzip con 3–5× más velocidad
  • xz gana en tamaño pero sentirás el tiempo de compresión en datasets grandes
  • La descompresión de zstd es consistentemente la más rápida sin importar el nivel de compresión
  • zip siempre pierde en ratio porque comprime archivos individualmente

Para trabajo diario, zstd con configuración por defecto es la mejor opción general. Usa xz cuando crees archivos que serán descargados miles de veces (el tiempo extra de compresión se paga en ancho de banda). Usa gzip cuando necesites compatibilidad garantizada con cualquier sistema.

FAQ

¿Cuál es la diferencia entre .tar.gz y .tgz?

Son el mismo formato. .tgz es una abreviación que existe porque los sistemas DOS y Windows antiguos no podían manejar extensiones dobles. Puedes usar cualquier nombre — tar no distingue.

¿Puedo extraer un solo archivo de un .tar.gz sin descomprimir todo?

Puedes especificar la ruta del archivo al extraer (tar xzf archivo.tar.gz ruta/al/archivo), pero tar aún tiene que descomprimir todo el flujo hasta ese punto. Para acceso aleatorio real, usa zip.

¿Cómo veo el progreso mientras comprimo un archivo grande?

Usa pv (pipe viewer) entre tar y el compresor: tar cf - directorio/ | pv | gzip > archivo.tar.gz. Muestra una barra de progreso con velocidad y tiempo estimado.

¿Puede tar manejar archivos de más de 4GB?

Sí. GNU tar usa cabeceras extendidas POSIX y no tiene límite práctico de tamaño de archivo. Las implementaciones antiguas de zip (antes de Zip64) no podían manejar archivos de más de 4GB — otra razón para preferir tar en archivos grandes.

¿Debería usar gzip o zstd para proyectos nuevos?

Usa zstd si controlas tanto la compresión como la descompresión. Es más rápido y comprime mejor a velocidades comparables. Recurre a gzip solo cuando necesites compatibilidad con sistemas que podrían no tener zstd instalado (distribuciones anteriores a 2019, sistemas embebidos, imágenes Docker mínimas).

¿Cómo comprimo un disco o partición completa?

Usa dd con pipe al compresor: dd if=/dev/sda bs=4M | zstd -T0 > imagen-disco.zst. Para backups a nivel de sistema de archivos, tar con --one-file-system es más seguro: tar --one-file-system -czf backup-root.tar.gz /.

¿Cómo verifico que un archivo no está corrupto?

Ejecuta tar tzf archivo.tar.gz > /dev/null — esto lee todo el archivo y dará error si hay corrupción. Para archivos gzip específicamente, gzip -t file.gz hace una verificación de integridad. Para zstd, zstd -t file.zst.

¿Qué hace el flag -p en tar?

El flag -p (preserve permissions) mantiene los permisos originales, propietario y timestamps al extraer. GNU tar preserva permisos por defecto cuando se ejecuta como root, pero es mejor usar -p explícitamente al restaurar backups para asegurarte de que nada se modifique.

Conclusión

El patrón básico es simple: tar agrupa, los compresores reducen, y casi siempre quieres ambos. Para el trabajo diario, tar --zstd -cf y tar xf cubren el 90% de lo que necesitas. Usa zip cuando importa compartir entre plataformas, y xz cuando distribuyes software y cada kilobyte cuenta.

Los comandos que más te servirán:

bash
# Crear (zstd, sistemas modernos)
tar --zstd -cf archivo.tar.zst directorio/

# Crear (gzip, compatibilidad universal)
tar czf archivo.tar.gz directorio/

# Extraer (cualquier formato, detección automática)
tar xf archivo.tar.gz

# Listar contenidos antes de extraer
tar tf archivo.tar.gz

# Compartir entre plataformas
zip -r archivo.zip directorio/

Para más herramientas CLI que combinan bien con tar, consulta el mapa de herramientas CLI. La guía de find cubre patrones de selección de archivos, y la guía de ssh y rsync tiene más sobre flujos de transferencia remota.