Sistema de archivos y tareas en lote
Los scripts en shell son especialmente potentes para gestionar el sistema de archivos: crear, mover, copiar, buscar, comprimir, sincronizar y mucho más.
1. Comandos básicos para archivos y directorios #
| Comando | Descripción |
|---|---|
pwd | Muestra la carpeta actual |
ls | Lista archivos y carpetas |
cd | Cambia de directorio |
mkdir | Crea carpetas |
touch | Crea archivos vacíos |
cp | Copia archivos y carpetas |
mv | Mueve o renombra archivos/carpeta |
rm | Borra archivos (-r para carpetas) |
stat | Muestra metadatos de archivos |
file | Muestra el tipo de archivo |
Ejemplo: creación de estructura #
1mkdir -p proyecto/{src,bin,docs} 2touch proyecto/src/main.sh 3ls -R proyecto
Salida:
proyecto:
bin docs src
proyecto/src:
main.sh
2. Permisos y propietarios #
Los permisos definen quién puede leer (r), escribir (w) o ejecutar (x) archivos y carpetas.
- Ver permisos:
1ls -l
Ejemplo de salida:
-rwxr-xr-- 1 angel staff 120 sep 30 main.sh
- Cambiar permisos:
1chmod +x main.sh # Añade permiso de ejecución 2chmod 644 archivo.txt # rw-r--r--
- Cambiar propietario:
1sudo chown usuario:grupo archivo.txt
- Ajustar máscara por defecto (para archivos nuevos):
1umask 022
3. Buscar archivos con find #
Buscar por nombre:
1find /home -name "*.log"
Buscar por tamaño:
1find . -size +10M
Buscar archivos modificados en las últimas 24h:
1find . -mtime -1
Eliminar archivos vacíos:
1find . -type f -empty -delete
4. Procesar lotes de archivos con xargs #
xargs toma datos de la entrada estándar y los pasa como argumentos a un comando.
Ejemplo: borrar todos los .tmp encontrados:
1find . -name "*.tmp" -print0 | xargs -0 rm -f
-print0y-0permiten manejar nombres con espacios de forma segura.
5. Copias y sincronización con rsync #
Copiar una carpeta completa:
1rsync -av origen/ destino/
-a→ copia recursiva con permisos-v→ modo detallado
Sincronizar dos carpetas, eliminando archivos que ya no existen en el origen:
1rsync -av --delete origen/ destino/
Copiar a un servidor remoto:
1rsync -av ./proyecto user@server:/home/user/backup
6. Comprimir y descomprimir archivos #
Con tar #
Comprimir:
1tar -czf backup.tar.gz carpeta/
Descomprimir:
1tar -xzf backup.tar.gz
Listar contenido sin descomprimir:
1tar -tzf backup.tar.gz
Con zip y unzip #
Comprimir:
1zip -r backup.zip carpeta/
Descomprimir:
1unzip backup.zip
7. Vigilancia de archivos con inotifywait (Linux) #
Útil para scripts que reaccionan a cambios en carpetas.
Instalar:
1sudo apt install inotify-tools
Vigilar cambios en una carpeta:
1inotifywait -m ./logs
Ejemplo: ejecutar un comando cuando se cree un nuevo archivo:
1inotifywait -m ./logs -e create | 2while read dir action file; do 3 echo "Nuevo archivo detectado: $file" 4done
8. Ejemplo integrador: limpieza y backup automático #
Crea un script backup_logs.sh que:
- Cree un directorio
backups/si no existe. - Encuentre todos los archivos
.logmodificados en los últimos 7 días. - Los comprima en
logs_YYYYMMDD.tar.gz. - Mueva el archivo comprimido a
backups/. - Elimine los
.logantiguos (>30 días).
Solución de ejemplo #
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4FECHA=$(date +%Y%m%d) 5DEST=backups 6mkdir -p "$DEST" 7 8echo "Buscando logs recientes..." 9find . -name "*.log" -mtime -7 -print > lista.txt 10 11if [[ -s lista.txt ]]; then 12 tar -czf "logs_${FECHA}.tar.gz" -T lista.txt 13 mv "logs_${FECHA}.tar.gz" "$DEST/" 14 echo "Backup creado: $DEST/logs_${FECHA}.tar.gz" 15else 16 echo "No hay logs recientes para respaldar" 17fi 18 19echo "Eliminando logs antiguos..." 20find . -name "*.log" -mtime +30 -delete 21echo "Proceso completado."
9. Ejercicio práctico 1 #
Crea un script organiza_descargas.sh que:
-
Busque en la carpeta
~/Descargasarchivos de los últimos 2 días. -
Mueva:
- Todos los
.jpga~/Descargas/Imagenes - Todos los
.pdfa~/Descargas/PDFs - Todo lo demás a
~/Descargas/Otros
- Todos los
10. Ejercicio práctico 2 #
Crea un script sincroniza_proyecto.sh que:
- Pida al usuario una ruta remota (por ejemplo:
usuario@servidor:/carpeta). - Use
rsyncpara sincronizar la carpeta~/proyectocon la ruta remota. - Muestre un reporte con los archivos sincronizados.
11. Buenas prácticas #
- ✅ Usa siempre rutas absolutas en tareas críticas.
- ✅ Comprueba que las carpetas de destino existen antes de mover/copiar.
- ✅ Haz backups comprimidos para ahorrar espacio.
- ✅ Usa
rsync --dry-runpara simular sincronizaciones antes de ejecutarlas. - ✅ Combina
find+xargspara tareas en lote grandes.
Resumen del tema
Conceptos clave #
- Operaciones y Metadatos del Sistema de Archivos: comandos esenciales (
mkdir -p,touch,cp,mv,rm -rf,stat,file) y gestión de permisos/propiedad (chmod,chown,umask). - Búsqueda Avanzada con
find: filtrado granular por nombre (-name), tipo (-type f/d), tamaño (-size), tiempo de modificación (-mtime) y acciones destructivas controladas (-delete,-empty). - Procesamiento en Lote Seguro (
find ... -print0 | xargs -0): paso seguro de flujos de archivos hacia utilidades del sistema manejando espacios en blanco y caracteres especiales. - Sincronización Eficiente con
rsync: transferencia incremental local y remota (rsync -av --delete origen/ destino/). - Empaquetado y Compresión (
tar/zip): creación y descompresión de archivos (tar -czf/tar -xzf). - Monitorización de Eventos (
inotifywait): vigilancia reactiva de creación, modificación y borrado de archivos en tiempo real.
Qué debes recordar #
La combinación de find -print0 | xargs -0 y rsync -av permite automatizar tareas en lote y respaldos incrementales de forma segura y eficiente.