Curso de Shell Scripting
Los scripts en shell son especialmente potentes para gestionar el sistema de archivos: crear, mover, copiar, buscar, comprimir, sincronizar y mucho más.
10.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
10.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
10.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
10.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.
10.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
10.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
10.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
10.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."
🏋️♂️ 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
🏋️♂️ 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.
✅ 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.
- Loading...