Ghost AcademySecLearn// Seguridad Informática
🌐 unfantasmaenelsistema.com
🗜️ Comandos Linux · Archivado y compresión
Archivos y Compresión
// tar · gzip · bzip2 · xz · zip · zcat · file · dd

Guía completa de los comandos de archivado y compresión en Linux: combinación de archivos, reducción de tamaño, visualización sin descomprimir, identificación de formatos y copia de bajo nivel con dd.

tar — archivar + comprimir gzip · gunzip bzip2 · xz zip · unzip · zcat file — tipo ELF dd — copia de bloques
📦
tar — Archivador y Compresor
Combina múltiples archivos/directorios en un solo tarball, con compresión opcional

tar (Tape ARchiver) agrupa archivos en un único fichero .tar y, opcionalmente, lo comprime con gzip, bzip2 o xz. El resultado se conoce como tarball.

sintaxis
tar [opciones] archivo.tar [archivos/directorios]

Opciones comunes

OpciónFunciónDescripción
-cCreateCrea un nuevo archivo .tar.
-xeXtractExtrae archivos de un .tar.
-tlisTLista el contenido sin extraer.
-vVerboseMuestra los archivos a medida que se procesan.
-fFileEspecifica el nombre del archivo de archivado. Siempre va al final.
-zGzipComprime/descomprime con gzip → .tar.gz / .tgz.
-jBzip2Comprime/descomprime con bzip2 → .tar.bz2.
-JxzComprime/descomprime con xz → .tar.xz.
-CdirectoryEspecifica el directorio de destino al extraer.

Preparar archivos de ejemplo

bash
mkdir -p /home/jose/documentos/informes
echo "Reporte 1" > /home/jose/documentos/documento_a.txt
echo "Informe de ventas" > /home/jose/documentos/informes/ventas_2025.txt

Ejemplo 1 — Archivar sin comprimir

bash — crear .tar
tar -cvf backup.tar /home/jose/documentos/
# tar elimina automáticamente la / inicial por seguridad
home/jose/documentos/
home/jose/documentos/documento_a.txt
home/jose/documentos/informes/ventas_2025.txt
ℹ️ ¿Por qué se elimina la / inicial?
Por seguridad: si tar conservara la /, al extraer el archivo en otro sistema escribiría en las rutas absolutas originales, pudiendo sobrescribir archivos del sistema. Al eliminarla, la extracción es relativa al directorio actual.

Ejemplo 2 — Archivar y comprimir con gzip

bash — crear .tar.gz
tar -czvf backup.tar.gz /home/jose/documentos/
home/jose/documentos/
home/jose/documentos/documento_a.txt
...

Ejemplo 3 — Extraer en directorio específico

bash — extraer .tar.gz
mkdir extraccion_temp
tar -xzvf backup.tar.gz -C /home/jose/restaurar/

Ejemplo 4 — Listar contenido sin extraer

bash — listar
tar -tvf backup.tar.gz
💡 Receta rápida: -czvf para crear, -xzvf para extraer. La f siempre al final y seguida del nombre del archivo.
gzip / gunzip Compresión individual de archivos — formato .gz

gzip comprime un único archivo y reemplaza el original con la versión .gz. gunzip hace la operación inversa.

ComandoFunciónDescripción
gzip archivoComprimeCrea archivo.gz y elimina el original.
gunzip archivo.gzDescomprimeRestaura el original y elimina el .gz.
gzip -d archivo.gzDescomprimeAlternativa a gunzip.
gzip -k archivoKeepComprime pero mantiene el original.
gzip -l archivo.gzListMuestra la tasa de compresión sin descomprimir.

Ejemplo práctico — Comprimir y descomprimir

bash
# Copiar un archivo grande para el ejemplo
cp /etc/services services
ls -lh services
-rw-r--r-- 1 jose jose 20K Oct 9 07:15 services

# Comprimir — el original desaparece
gzip services
ls -lh services.gz
-rw-r--r-- 1 jose jose 7.5K Oct 9 07:15 services.gz

# Descomprimir — el original regresa
gunzip services.gz
ls -lh services
-rw-r--r-- 1 jose jose 20K Oct 9 07:15 services

# Mantener el original al comprimir
gzip -k /home/jose/notas.txt
# Ahora existen: notas.txt y notas.txt.gz
bzip2 / bunzip2 Mayor compresión que gzip, algo más lento — formato .bz2
ComandoArchivo resultanteDescompresión
bzip2 archivoarchivo.bz2 (original eliminado)bzip2 -d archivo.bz2 o bunzip2 archivo.bz2
bzip2 -k archivoarchivo.bz2 (original conservado)—
bash
bzip2 /home/jose/logs.txt        # crea logs.txt.bz2
bzip2 -k /home/jose/logs.txt     # mantiene el original
bunzip2 logs.txt.bz2             # descomprime
xz / unxz Alta compresión, más moderno que bzip2 — formato .xz
ComandoArchivo resultanteDescompresión
xz archivoarchivo.xz (original eliminado)xz -d archivo.xz o unxz archivo.xz
xz -k archivoarchivo.xz (original conservado)—
bash — xz supera a gzip en tamaño
cp /etc/services services_xz
xz services_xz
ls -lh services_xz.xz
-rw-r--r-- 1 jose jose 6.8K Oct 9 07:16 services_xz.xz
# 6.8K vs 7.5K de gzip — ¡más comprimido!

unxz services_xz.xz

Comparativa de compresores

gzip
.gz / .tar.gz
Velocidad: ⚡ Rápida
Compresión: Media
Ejemplo: 20K → 7.5K
Ratio de compresión relativo
bzip2
.bz2 / .tar.bz2
Velocidad: 🐢 Más lenta
Compresión: Alta
Más compacto que gzip
Ratio de compresión relativo
xz
.xz / .tar.xz
Velocidad: 🐢🐢 Más lenta
Compresión: Muy alta
Ejemplo: 20K → 6.8K
Ratio de compresión relativo
Comparativa tamaño — archivo /etc/services (20K original)
services
20K
services.gz
7.5K
services_xz.xz
6.8K
🗂️
zip / unzip — Formato multiplataforma
Estándar en Windows y macOS — diferente a los formatos nativos UNIX
zip Crear archivos ZIP
OpciónDescripción
-rRecursive — incluye subdirectorios.
-eEncrypt — pide una contraseña para el ZIP.
bash — comprimir varios archivos y directorios
# Comprimir varios archivos
zip documentos.zip /home/jose/archivo1.txt /home/jose/archivo2.txt

# Comprimir recursivamente un directorio
zip -r documentos.zip /home/jose/documentos/

# Comprimir con contraseña (-e)
zip -r -e datos_trabajo.zip Trabajo/
Enter password:
Verify password:
  adding: Trabajo/ (stored 0%)
  adding: Trabajo/plan.doc (deflated 5%)
unzip Extraer archivos ZIP
OpciónDescripción
-d directorioDirectory — especifica el directorio de destino.
bash — extraer en directorio específico
unzip documentos.zip -d /home/jose/restaurar/

# Si tiene contraseña, la pedirá automáticamente
unzip datos_trabajo.zip -d /tmp/datos_temporales
Archive:  datos_trabajo.zip
[datos_trabajo.zip] Trabajo/plan.doc password:
  extracting: /tmp/datos_temporales/Trabajo/plan.doc
👁️
zcat — Ver comprimidos sin descomprimir
Inspecciona archivos .gz directamente sin crear archivos temporales

zcat descomprime el contenido en memoria y lo envía a stdout — el archivo .gz original no se modifica.

bash — inspeccionar log comprimido
# Ver syslog rotado con paginador
sudo zcat /var/log/syslog.1.gz | less

# Verificar si el archivo existe primero
ls -lh /var/log/syslog.1.gz

# Si no existe, crear uno de prueba
echo "Línea de prueba 1" > syslog.1
gzip syslog.1
zcat syslog.1.gz | less
📌 ¿Cuándo existe /var/log/syslog.1.gz?
syslogarchivo activo
→
logrotate
rota el log
→
syslog.1renombrado
→
gzip comprime
→
syslog.1.gzarchivo rotado
→
syslog.2.gzsiguiente rotación
ℹ️ En una máquina recién instalada puede que syslog.1.gz no exista aún. Aparece una vez que logrotate ha hecho su primera rotación de logs.
🔎
file — Identificar tipo de archivo
Examina los bytes del archivo, no la extensión

file es fundamental en el contexto de archivos comprimidos: identifica el formato real del archivo aunque tenga una extensión incorrecta o no tenga ninguna.

bash — identificar formatos comprimidos
# Crear y comprimir un ejemplo .tar.bz2
mkdir datos_ejemplo
echo "Archivo 1" > datos_ejemplo/a.txt
echo "Archivo 2" > datos_ejemplo/b.txt
tar -cjvf backup.tar.bz2 datos_ejemplo/

# Identificar tipo
file backup.tar.bz2
backup.tar.bz2: bzip2 compressed data, block size 900k

file backup.tar.gz
backup.tar.gz: gzip compressed data, ...

file backup.zip
backup.zip: Zip archive data

file en binarios — Formato ELF

bash — inspeccionar ejecutables
file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=..., for GNU/Linux 3.2.0, stripped

file /usr/bin/passwd
TérminoSignificado
ELFExecutable and Linkable Format — formato estándar de binarios en Linux para ejecutables, bibliotecas y core dumps.
64-bit LSBCompilado para procesador de 64 bits con byte order Little Endian (Least Significant Byte).
dynamically linkedDepende de bibliotecas externas que se cargan en tiempo de ejecución. Ahorra espacio en disco.
interpreter /lib64/...Ruta al cargador dinámico — carga las bibliotecas necesarias antes de ejecutar el programa.
strippedLos símbolos de depuración han sido eliminados del binario para reducir su tamaño.
ℹ️ Relevancia en seguridad (buffer overflow):
En arquitecturas 32 bits (x86), los punteros ocupan 4 bytes y se usa el registro EIP. En 64 bits (x86-64), los punteros son 8 bytes, se usa RIP, y los argumentos se pasan por registros (RDI, RSI, RDX…). Esto hace que la explotación de buffer overflows en 64 bits requiera técnicas avanzadas como ROP chaining para sortear NX/DEP y ASLR.
💾
dd — Copia y conversión de bajo nivel
Data Duplicator — copia byte a byte · imágenes de disco · archivos de prueba
⚠️
Advertencia — Comando destructivo
El uso incorrecto de dd puede sobrescribir particiones enteras del sistema sin confirmación. Siempre verifica los parámetros if= y of= antes de ejecutar. Un error en of= puede destruir datos irrecuperablemente.
OpciónFunciónDescripción
if=Input FileArchivo o dispositivo de entrada (fuente).
of=Output FileArchivo o dispositivo de salida (destino).
bs=Block SizeTamaño de bloque para lectura/escritura (ej. 4M, 1M).
count=CountNúmero de bloques a copiar.
status=progressProgressMuestra el progreso de la copia en tiempo real.

Ejemplo 1 — Imagen de disco completo

bash — imagen de /dev/sda (requiere sudo)
sudo dd if=/dev/sda of=/mnt/usb/sda_image.img bs=4M status=progress
450+0 records in
450+0 records out
1887436800 bytes (1.9 GB, 1.8 GiB) copied, 32.545 s, 58.0 MB/s

Ejemplo 2 — Backup de dispositivo USB

bash
sudo dd if=/dev/sdb of=/home/jose/usb_backup.img bs=4M status=progress

Ejemplo 3 — Crear archivo de 100 MB lleno de ceros

bash — útil para pruebas o swap
dd if=/dev/zero of=archivo_vacio.dat bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.04 s, 2.6 GB/s

# Verificar tamaño
ls -lh archivo_vacio.dat
-rw-r--r-- 1 jose jose 100M Oct 10 08:45 archivo_vacio.dat

Anatomía del comando dd

Parte del comandoSignificadoPropósito en el ejemplo
dd Data Duplicator Comando principal para copia a nivel de bloque.
if=/dev/zero Input File Fuente virtual que produce bytes nulos (ceros binarios) indefinidamente.
of=archivo_vacio.dat Output File Nombre del archivo que se crea en el directorio actual.
bs=1M Block Size Cada lectura y escritura se hace en bloques de 1 Megabyte.
count=100 Count Se escriben 100 bloques de 1 MB = 100 MB totales.
📐 Cálculo: 1 MB/bloque × 100 bloques = 100 MB
🏋️
Ejercicio Final Integrador
Combina todos los comandos: crear · comprimir · listar · inspeccionar · extraer · clonar
🎯 Objetivo: flujo completo de archivado y compresión
bash — ejercicio completo
# 1. Crear carpeta de prueba con archivos
mkdir -p /home/jose/test
echo "Hola mundo" > /home/jose/test/uno.txt
echo "Prueba 2"   > /home/jose/test/dos.txt

# 2. Comprimir en tar.gz
tar -czvf /home/jose/test.tar.gz /home/jose/test/

# 3. Ver contenido sin extraer
tar -tvf /home/jose/test.tar.gz

# 4. Identificar tipo de archivo
file /home/jose/test.tar.gz
/home/jose/test.tar.gz: gzip compressed data, ...

# 5. Extraer en directorio específico
tar -xzvf /home/jose/test.tar.gz -C /home/jose/

# 6. Crear backup exacto con dd
dd if=/home/jose/test.tar.gz of=/home/jose/test_backup.img bs=1M status=progress

# BONUS: comparar compresores sobre el mismo directorio
tar -czvf test.tar.gz   /home/jose/test/  # gzip
tar -cjvf test.tar.bz2  /home/jose/test/  # bzip2
tar -cJvf test.tar.xz   /home/jose/test/  # xz
ls -lh test.tar.*
💡 Resumen de extensiones: .tar = solo archivado · .tar.gz = tar + gzip · .tar.bz2 = tar + bzip2 · .tar.xz = tar + xz · .zip = zip multiplataforma