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

ComandoDescripción
pwdMuestra la carpeta actual
lsLista archivos y carpetas
cdCambia de directorio
mkdirCrea carpetas
touchCrea archivos vacíos
cpCopia archivos y carpetas
mvMueve o renombra archivos/carpeta
rmBorra archivos (-r para carpetas)
statMuestra metadatos de archivos
fileMuestra 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

-print0 y -0 permiten 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:

  1. Cree un directorio backups/ si no existe.
  2. Encuentre todos los archivos .log modificados en los últimos 7 días.
  3. Los comprima en logs_YYYYMMDD.tar.gz.
  4. Mueva el archivo comprimido a backups/.
  5. Elimine los .log antiguos (>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:

  1. Busque en la carpeta ~/Descargas archivos de los últimos 2 días.

  2. Mueva:

    • Todos los .jpg a ~/Descargas/Imagenes
    • Todos los .pdf a ~/Descargas/PDFs
    • Todo lo demás a ~/Descargas/Otros

🏋️‍♂️ Ejercicio práctico 2

Crea un script sincroniza_proyecto.sh que:

  1. Pida al usuario una ruta remota (por ejemplo: usuario@servidor:/carpeta).
  2. Use rsync para sincronizar la carpeta ~/proyecto con la ruta remota.
  3. Muestre un reporte con los archivos sincronizados.

✅ Buenas prácticas

  1. ✅ Usa siempre rutas absolutas en tareas críticas.
  2. ✅ Comprueba que las carpetas de destino existen antes de mover/copiar.
  3. ✅ Haz backups comprimidos para ahorrar espacio.
  4. ✅ Usa rsync --dry-run para simular sincronizaciones antes de ejecutarlas.
  5. ✅ Combina find + xargs para tareas en lote grandes.

  • Loading...