3  Gestión de Archivos

La gestión eficiente de archivos va más allá de simples operaciones de copia y movimiento. Esta sección cubre herramientas avanzadas para renombrado masivo, sincronización inteligente y manipulación sofisticada de archivos y directorios.

3.1 rename / renameutils - Renombrado masivo

Las herramientas de renombrado masivo permiten modificar nombres de múltiples archivos usando expresiones regulares y patrones.

3.1.1 rename (Perl-based)

# Verificar que tienes la versión correcta
rename --version

3.1.2 Ejemplos básicos

3.1.2.1 Cambios de extensión

# Cambiar .jpeg a .jpg
rename 's/\.jpeg$/\.jpg/' *.jpeg

# Cambiar .txt a .md
rename 's/\.txt$/\.md/' *.txt

# Agregar extensión faltante
rename 's/$/.bak/' archivo1 archivo2

3.1.2.2 Modificaciones de texto

# Cambiar espacios por guiones bajos
rename 's/ /_/g' *.txt

# Cambiar guiones por puntos
rename 's/-/./g' *.md

# Eliminar caracteres especiales
rename 's/[^a-zA-Z0-9._-]//g' *

# Cambiar a minúsculas
rename 'y/A-Z/a-z/' *.TXT

3.1.3 Ejemplos avanzados

3.1.3.1 Renombrado con fecha

# Agregar fecha actual al final
rename 's/(.*)\.(.*)/$1_$(date +%Y%m%d).$2/e' *.log

# Renombrar fotos con timestamp
for file in *.jpg; do
    timestamp=$(date -r "$file" +%Y%m%d_%H%M%S)
    rename "s/.*/${timestamp}.jpg/" "$file"
done

3.1.3.2 Renombrado condicional

# Solo archivos que contengan "old" en el nombre
rename 's/old/new/g' *old*

# Renombrar solo si el archivo es mayor a 1MB
find . -size +1M -name "*.log" -exec rename 's/\.log$/.big.log/' {} \;

3.1.4 mmv - Renombrado múltiple visual

mmv proporciona una interfaz más visual para renombrado masivo.

# Renombrar múltiples archivos con patrón
mmv '*.jpeg' '*.jpg'

# Mover archivos con renombrado
mmv 'dir1/*.txt' 'dir2/#1.backup'

# Intercambiar extensiones
mmv '*.{txt,md}' '*.{md,txt}'

3.1.5 Casos de uso prácticos

3.1.5.1 Organización de fotos

# Renombrar fotos por fecha de creación
#!/bin/bash
for img in *.jpg *.png; do
    if [ -f "$img" ]; then
        # Obtener fecha de creación
        date_taken=$(exiftool -d "%Y%m%d_%H%M%S" -DateTimeOriginal -s -s -s "$img")
        if [ ! -z "$date_taken" ]; then
            ext="${img##*.}"
            mv "$img" "photo_${date_taken}.${ext}"
        fi
    fi
done

3.1.5.2 Limpieza de downloads

# Normalizar nombres de archivos descargados
rename 's/[^a-zA-Z0-9._-]/_/g' ~/Downloads/*
rename 's/__+/_/g' ~/Downloads/*  # Eliminar guiones bajos dobles
rename 's/^_|_$//g' ~/Downloads/*  # Eliminar guiones al inicio/final

3.2 rsync - Sincronización avanzada

rsync es mucho más que una herramienta de copia; es un sistema completo de sincronización y backup.

3.2.1 Sintaxis básica

rsync [opciones] origen destino

3.2.2 Opciones esenciales

Opción Descripción
-a Modo archivo (preserva todo)
-v Verboso
-h Formato legible
-z Comprimir durante transferencia
-P Mostrar progreso y permitir resumir
--delete Eliminar archivos extra en destino
--dry-run Solo mostrar qué haría

3.2.3 Ejemplos básicos

3.2.3.1 Copia local

# Copia básica con progreso
rsync -avh --progress origen/ destino/

# Nota: la barra final en origen/ es importante
# Con barra: copia CONTENIDO de origen a destino
# Sin barra: copia DIRECTORIO origen dentro de destino

3.2.3.2 Sincronización

# Sincronizar eliminando archivos extra
rsync -avh --delete origen/ destino/

# Vista previa de sincronización
rsync -avh --delete --dry-run origen/ destino/

# Sincronizar solo archivos más nuevos
rsync -avh --update origen/ destino/

3.2.4 Ejemplos avanzados

3.2.4.1 Filtros y exclusiones

# Excluir archivos específicos
rsync -avh --exclude='*.log' --exclude='temp/' origen/ destino/

# Usar archivo de exclusiones
echo "*.log" > exclude.txt
echo "node_modules/" >> exclude.txt
rsync -avh --exclude-from=exclude.txt origen/ destino/

# Incluir solo tipos específicos
rsync -avh --include='*.txt' --exclude='*' origen/ destino/

3.2.4.2 Backup incremental

# Backup con hardlinks para ahorrar espacio
rsync -avh --link-dest=../backup.previous origen/ backup.current/

# Script de backup rotativo
#!/bin/bash
BACKUP_DIR="/backups"
SOURCE="/home/user"
DATE=$(date +%Y%m%d)

# Crear backup con link a anterior
rsync -avh --delete --link-dest="$BACKUP_DIR/latest" \
      "$SOURCE/" "$BACKUP_DIR/backup-$DATE/"

# Actualizar enlace 'latest'
rm -f "$BACKUP_DIR/latest"
ln -s "backup-$DATE" "$BACKUP_DIR/latest"

3.2.4.3 Transferencia remota

# Subir archivos por SSH
rsync -avh -e ssh archivo.txt user@server:/ruta/destino/

# Descargar desde servidor
rsync -avh user@server:/ruta/origen/ ./local/

# Con puerto SSH personalizado
rsync -avh -e "ssh -p 2222" local/ user@server:/remoto/

# Con compresión adicional
rsync -avhz local/ user@server:/remoto/

3.2.5 Casos de uso especializados

3.2.5.1 Sincronización de desarrollo

# Sincronizar código excluyendo archivos de build
rsync -avh --exclude='.git/' --exclude='node_modules/' \
           --exclude='dist/' --exclude='*.log' \
           ./proyecto/ servidor:/var/www/proyecto/

3.2.5.2 Backup de bases de datos

# Backup de directorio de PostgreSQL
sudo rsync -avh --delete /var/lib/postgresql/data/ /backup/postgres/

# Con parada y reinicio de servicio
sudo systemctl stop postgresql
sudo rsync -avh /var/lib/postgresql/data/ /backup/postgres/
sudo systemctl start postgresql

3.2.5.3 Monitoreo de cambios

# Ver qué cambiaría sin ejecutar
rsync -avh --delete --dry-run origen/ destino/ | tee cambios.log

# Solo mostrar archivos nuevos/modificados
rsync -avh --itemize-changes origen/ destino/

3.3 Herramientas complementarias

3.3.1 find - Búsqueda avanzada de archivos

# Encontrar archivos para renombrar
find . -name "*.jpeg" -exec rename 's/\.jpeg$/\.jpg/' {} \;

# Encontrar archivos duplicados por tamaño
find . -type f -exec du -h {} + | sort -h | uniq -d -w 8

# Encontrar archivos grandes
find . -type f -size +100M -exec ls -lh {} \;

3.3.2 xargs - Procesamiento en lotes

# Renombrar múltiples archivos encontrados
find . -name "*.tmp" | xargs -I {} mv {} {}.backup

# Aplicar comando a archivos seleccionados
ls *.txt | xargs -I {} cp {} backup/{}

3.3.3 chmod y chown - Permisos masivos

# Cambiar permisos recursivamente
find ./proyecto -type f -name "*.sh" -exec chmod +x {} \;

# Cambiar propietario de archivos específicos
find ./uploads -name "*.jpg" -exec chown www-data:www-data {} \;

3.4 Workflows complejos

3.4.1 Organización automática de descargas

#!/bin/bash
# Script para organizar Downloads por tipo

DOWNLOADS="$HOME/Downloads"
cd "$DOWNLOADS"

# Crear directorios si no existen
mkdir -p {Images,Documents,Videos,Audio,Archives,Code}

# Mover archivos por tipo
find . -maxdepth 1 -name "*.{jpg,jpeg,png,gif,bmp}" -exec mv {} Images/ \;
find . -maxdepth 1 -name "*.{pdf,doc,docx,txt,rtf}" -exec mv {} Documents/ \;
find . -maxdepth 1 -name "*.{mp4,avi,mkv,mov}" -exec mv {} Videos/ \;
find . -maxdepth 1 -name "*.{mp3,wav,flac,m4a}" -exec mv {} Audio/ \;
find . -maxdepth 1 -name "*.{zip,tar,gz,rar,7z}" -exec mv {} Archives/ \;
find . -maxdepth 1 -name "*.{py,js,html,css,json}" -exec mv {} Code/ \;

# Renombrar archivos problemáticos
rename 's/[^a-zA-Z0-9._-]/_/g' *

3.4.2 Backup diferencial inteligente

#!/bin/bash
# Backup que solo copia archivos modificados

SOURCE="/home/user/important"
BACKUP="/backup/incremental"
LOGFILE="/var/log/backup.log"

# Crear timestamp
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
echo "[$TIMESTAMP] Iniciando backup..." >> "$LOGFILE"

# Backup con checksums para verificar integridad
rsync -avh --checksum --delete \
      --backup --backup-dir="../deleted-$TIMESTAMP" \
      --log-file="$LOGFILE" \
      "$SOURCE/" "$BACKUP/current/"

# Verificar integridad
if [ $? -eq 0 ]; then
    echo "[$TIMESTAMP] Backup completado exitosamente" >> "$LOGFILE"
else
    echo "[$TIMESTAMP] ERROR en backup" >> "$LOGFILE"
    exit 1
fi

3.4.3 Sincronización bidireccional

#!/bin/bash
# Sincronizar dos directorios en ambas direcciones

DIR1="/ruta/directorio1"
DIR2="/ruta/directorio2"
TEMP="/tmp/sync_temp"

# Crear directorio temporal
mkdir -p "$TEMP"

# Sincronizar DIR1 -> TEMP
rsync -avh --delete "$DIR1/" "$TEMP/"

# Sincronizar DIR2 -> DIR1
rsync -avh --delete "$DIR2/" "$DIR1/"

# Sincronizar TEMP -> DIR2
rsync -avh --delete "$TEMP/" "$DIR2/"

# Limpiar
rm -rf "$TEMP"
Advertencia importante
  • Siempre usa --dry-run antes de operaciones destructivas
  • Ten backups antes de renombrados masivos
  • Verifica rutas cuidadosamente con rsync (especialmente las barras finales)
  • Prueba scripts en directorios de test antes de aplicar a datos importantes
Tips para gestión de archivos
  • Combina find con xargs para operaciones en lotes eficientes
  • Usa rsync en lugar de cp para copias grandes o frecuentes
  • Automatiza tareas repetitivas con scripts que usen estas herramientas
  • Mantén logs de operaciones importantes para auditoría

En el próximo capítulo exploraremos herramientas de búsqueda y filtrado que te permitirán encontrar información rápidamente en grandes volúmenes de datos.