9. Gestión de Archivos y Automatización del Sistema

La automatización en Bash suele implicar mover, copiar, buscar, procesar y vigilar archivos, además de ejecutar tareas periódicas. En este módulo aprenderás a manipular archivos desde scripts y a automatizar acciones sobre el sistema, entrando ya en terreno de administrador serio.


1. Comandos esenciales para gestionar archivos

Bash no inventa nada aquí: usa comandos del sistema. Estos son tus martillos y destornilladores:

ComandoUso
cpCopiar archivos o directorios
mvMover o renombrar
rmBorrar archivos
mkdirCrear directorios
rmdirBorrar directorios vacíos
touchCrear archivos vacíos o actualizar fecha
chmodCambiar permisos
chownCambiar propietario
findBuscar archivos
fileDetectar tipo de archivo

Ejemplos rápidos:





cp origen.txt destino.txt
mv archivo.txt /tmp/
rm viejo.txt
mkdir respaldos
touch notas.log

2. Copias de seguridad (Backups) simples

Un backup básico es copiar archivos o carpetas a otro lugar. Ejemplo:





#!/bin/bash
cp -r /home/usuario/documentos /home/usuario/respaldo/

Añadir fecha para evitar sobreescritura:





fecha=$(date +%Y-%m-%d)
cp -r /home/usuario/documentos "/home/usuario/respaldo/doc_$fecha"

Así tendrás:





doc_2026-01-12/
doc_2026-01-13/
doc_2026-01-14/
...

Automatización empieza aquí.


3. Comprimir y descomprimir desde scripts

Común en backups, logs y despliegue de software.

HerramientaUso
tarEmpaquetar/comprimir
gzCompresión gzip
zip/unzipCompresión zip

Ejemplo:





tar -czf respaldo.tar.gz /etc

Explicación:

  • c → crear
  • z → comprimir con gzip
  • f → indicar nombre del archivo

Descomprimir:





tar -xzf respaldo.tar.gz

4. Buscar archivos con find

find es un radar. Busca por nombre, tamaño, fecha, permisos…

Ejemplos útiles:

Encontrar archivos por nombre:





find /var/log -name "*.log"

Por tamaño:





find / -size +100M

Por fecha (modificados hace menos de 1 día):





find /tmp -mtime -1

Por permisos inseguros:





find /home -perm 777

Puedes además ejecutar acciones:





find /var/log -name "*.log" -exec gzip {} \;

Esto comprime todos los .log.


5. Analizar y procesar logs

Los logs cuentan la historia del sistema. Para analizarlos usamos:

  • grep (buscar patrones)
  • cut (extraer columnas)
  • awk (procesar datos)
  • sed (modificar texto)

Ejemplos básicos:

Buscar errores:





grep -i "error" /var/log/syslog

Buscar IPs:





grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" acceso.log

Contar líneas:





wc -l /var/log/auth.log

6. Automatización con cron

cron ejecuta tareas programadas automáticamente.

Editar tareas del usuario:





crontab -e

Formato:





MIN HORA DIA MES DIASEM EJECUTABLE

Ejemplos:

Ejecutar un script cada día a las 23:00:





0 23 * * * /home/user/scripts/backup.sh

Cada 5 minutos:





*/5 * * * * /home/user/scripts/monitor.sh

Ver tareas activas:





crontab -l

7. Automatización con systemd (modo pro)

systemd permite ejecutar servicios y temporizadores.

Estructura:

  • .service → define una acción
  • .timer → define cuándo se ejecuta

Ejemplo de servicio:

/etc/systemd/system/backup.service





[Unit]
Description=Backup Diario

[Service]
ExecStart=/usr/local/bin/backup.sh

Ejemplo de timer:

/etc/systemd/system/backup.timer





[Unit]
Description=Programa el backup diario

[Timer]
OnCalendar=daily

[Install]
WantedBy=timers.target

Activar timer:





systemctl enable --now backup.timer

Ver logs:





journalctl -u backup.service

Los alumnos pueden ver cómo se automatiza un servidor real.


8. Ejemplos

Ejemplo 1: Backup con timestamp





#!/bin/bash
fecha=$(date +%Y-%m-%d_%H-%M)
tar -czf backup_$fecha.tar.gz /home/alumno

Ejemplo 2: Buscar archivos grandes





#!/bin/bash
find / -size +500M > grandes.txt

Ejemplo 3: Comprimir logs viejos





#!/bin/bash
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;

Ejemplo 4: Filtrar errores de syslog





#!/bin/bash
grep -i "error" /var/log/syslog > errores.log

Ejercicios Propuestos

Ejercicio 1:
Crear un script backup.sh que comprima /etc en un archivo etc.tar.gz.

Ejercicio 2:
Crear un script buscar.sh que busque archivos .conf en /etc y guarde la lista en conf.txt.

Ejercicio 3:
Crear un script errores.sh que filtre la palabra “error” del archivo /var/log/syslog y lo guarde en errores.log.

Ejercicio 4:
Crear una entrada cron que ejecute backup.sh todos los días a las 23:00.

Ejercicio 5 (opcional pro):
Crear un .service + .timer para ejecutar buscar.sh cada hora.


Soluciones

✅ Ejercicio 1 — backup.sh

Enunciado:
Crear un script backup.sh que comprima /etc en un archivo etc.tar.gz.

💡 Solución básica:





#!/bin/bash
# Script: backup.sh
# Crea un backup comprimido del directorio /etc

tar -czf etc.tar.gz /etc
echo "Backup creado: etc.tar.gz"

💡 Solución un poco mejor (con fecha):





#!/bin/bash
# Script: backup.sh
# Crea un backup comprimido del directorio /etc con fecha

fecha=$(date +%Y-%m-%d_%H-%M)
archivo="etc_$fecha.tar.gz"

tar -czf "$archivo" /etc
echo "Backup creado: $archivo"

✅ Ejercicio 2 — buscar.sh

Enunciado:
Crear un script buscar.sh que busque archivos .conf en /etc y guarde la lista en conf.txt.

💡 Solución:





#!/bin/bash
# Script: buscar.sh
# Busca archivos .conf en /etc y los guarda en conf.txt

find /etc -type f -name "*.conf" > conf.txt
echo "Listado de archivos .conf guardado en conf.txt"

Si quieres que añada en lugar de sobrescribir:





find /etc -type f -name "*.conf" >> conf.txt

✅ Ejercicio 3 — errores.sh

Enunciado:
Crear un script errores.sh que filtre la palabra “error” del archivo /var/log/syslog y lo guarde en errores.log.

💡 Solución:





#!/bin/bash
# Script: errores.sh
# Filtra líneas con 'error' en /var/log/syslog y las guarda en errores.log

grep -i "error" /var/log/syslog > errores.log
echo "Líneas con 'error' guardadas en errores.log"
  • -i → ignora mayúsculas/minúsculas (ERROR, Error, error…).

✅ Ejercicio 4 — Entrada de cron

Enunciado:
Crear una entrada cron que ejecute backup.sh todos los días a las 23:00.

💡 Suposiciones:

  • El script está en: /home/usuario/scripts/backup.sh
  • Tiene permisos de ejecución: chmod +x backup.sh

💡 Línea de crontab:

Se edita con:





crontab -e

Y se añade:





0 23 * * * /home/usuario/scripts/backup.sh >> /home/usuario/scripts/backup.log 2>&1

Explicación rápida:

  • 0 23 * * * → a las 23:00 todos los días
  • >> backup.log 2>&1 → guarda salida y errores en un log (estilo “vida real”)

✅ Ejercicio 5 (opcional) — systemd service + timer

Enunciado:
Crear un .service + .timer para ejecutar buscar.sh cada hora.

1️⃣ Script buscar.sh (por si acaso):





#!/bin/bash
# /usr/local/bin/buscar.sh

find /etc -type f -name "*.conf" > /var/log/conf.txt

Dar permisos:





sudo chmod +x /usr/local/bin/buscar.sh

2️⃣ Unidad de servicio: /etc/systemd/system/buscar.service





[Unit]
Description=Buscar archivos .conf en /etc

[Service]
Type=oneshot
ExecStart=/usr/local/bin/buscar.sh

3️⃣ Unidad de temporizador: /etc/systemd/system/buscar.timer





[Unit]
Description=Ejecutar buscar.sh cada hora

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

4️⃣ Activar y comprobar

Recargar unidades:





sudo systemctl daemon-reload

Activar y arrancar el timer:





sudo systemctl enable --now buscar.timer

Ver estado:





systemctl status buscar.timer

Ver ejecuciones del servicio:





journalctl -u buscar.service