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:
# 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:
| Flag | Significado |
|---|---|
c | Crear un nuevo archivo |
x | Extraer de un archivo |
t | Listar contenidos sin extraer |
f | Especificar el nombre del fichero (casi siempre necesario) |
v | Modo verboso — mostrar cada archivo procesado |
z | Comprimir/descomprimir con gzip |
j | Comprimir/descomprimir con bjip2 |
J | Comprimir/descomprimir con xz (J mayúscula) |
Crear archivos
# 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:
# 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:
# 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:
# 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):
# 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.
# 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
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:
# 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.
# 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:
# 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
# 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
.jary.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:
#!/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:
# 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):
# 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:
# 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:
# 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):
| Algoritmo | Flag del comando | Tamaño comprimido | Velocidad compresión | Velocidad extracción |
|---|---|---|---|---|
| gzip -1 | tar czf (rápido) | ~45MB | Muy rápida | Rápida |
| gzip -6 | tar czf (default) | ~38MB | Rápida | Rápida |
| gzip -9 | tar czf (máximo) | ~37MB | Moderada | Rápida |
| bzip2 | tar cjf | ~33MB | Lenta | Lenta |
| xz -6 | tar cJf | ~28MB | Muy lenta | Moderada |
| zstd -3 | tar --zstd (default) | ~36MB | Muy rápida | Muy rápida |
| zstd -19 | tar --zstd (alto) | ~29MB | Lenta | Muy rápida |
| zip -6 | zip -r (default) | ~40MB | Rápida | Rá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:
# 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.