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 --version3.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 archivo23.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/' *.TXT3.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"
done3.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
done3.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/final3.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 destino3.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 destino3.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 postgresql3.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
fi3.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-runantes 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
findconxargspara operaciones en lotes eficientes - Usa
rsyncen lugar decppara 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.