Cómo escribir un script Bash de copia más seguro con tar
Crea un backup Bash que valide el origen, evite sobrescrituras, elimine archivos parciales y compruebe el archivo tar.
Iniciar lección interactivaUn script de copia útil debe rechazar un origen inexistente, guardar el destino fuera del origen, evitar sobrescribir otro archivo, borrar resultados parciales después de un fallo y revisar el archivo antes de anunciar el éxito. Este ejemplo didáctico crea un archivo tar comprimido con esas medidas. No sustituye un sistema completo de copias. La lección de scripting Bash permite practicar cómo encajan sus partes.
Define rutas explícitas de origen y destino
Guarda este contenido como backup.sh:
#!/usr/bin/env bash
set -euo pipefail
source_dir="${1:-$HOME/data}"
backup_dir="${2:-$HOME/backups}"
if [[ ! -d "$source_dir" ]]; then
printf 'Source directory not found: %s\n' "$source_dir" >&2
exit 1
fi
mkdir -p "$backup_dir"
source_parent=$(dirname "$source_dir")
source_name=$(basename "$source_dir")
timestamp=$(date '+%Y%m%d-%H%M%S')
archive="$backup_dir/${source_name}-${timestamp}.tar.gz"
partial="$archive.partial"
if [[ -e "$archive" || -e "$partial" ]]; then
printf 'Backup destination already exists: %s\n' "$archive" >&2
exit 1
fi
trap 'rm -f "$partial"' EXIT
tar -czf "$partial" -C "$source_parent" "$source_name"
tar -tzf "$partial" >/dev/null
mv "$partial" "$archive"
trap - EXIT
printf 'Backup created: %s\n' "$archive"
El primer argumento elige el directorio de origen y el segundo dónde guardar los archivos. Sin argumentos se usan $HOME/data y $HOME/backups. Mantén el destino fuera del origen para no archivar la propia salida.
Entiende las comprobaciones
set -euo pipefail detiene esta secuencia ante un fallo no controlado, una variable sin definir o un error dentro de una tubería. Sigue siendo necesario tratar explícitamente los fallos esperados.
La prueba del directorio se detiene antes de tar si falta el origen. La marca temporal evita reutilizar un nombre fijo y la comprobación de existencia rechaza una colisión. El script escribe primero una ruta .partial. Un trap de EXIT borra ese archivo si falla la creación o la revisión. Solo un archivo legible recibe el nombre definitivo.
Por qué tar utiliza -C
tar -czf "$partial" -C "$source_parent" "$source_name"
Las opciones crean (c), comprimen con gzip (z) y escriben en el archivo indicado (f). -C cambia de directorio durante la operación para no guardar una ruta absoluta.
Revisa la estructura:
tar -tzf "$archive"
Esto confirma que tar puede leerla, pero no demuestra que todos los datos estén actualizados ni que la restauración cumpla tus necesidades.
Ejecuta y prueba una restauración
bash -n backup.sh
bash backup.sh "$HOME/data" "$HOME/backups"
Después restaura en un directorio temporal:
restore_dir=$(mktemp -d)
tar -xzf "$HOME/backups/data-YYYYMMDD-HHMMSS.tar.gz" -C "$restore_dir"
find "$restore_dir" -type f
Sustituye el nombre de ejemplo por el mostrado por el script. Un plan real también necesita otro destino independiente, reglas de retención, monitorización, credenciales protegidas y pruebas periódicas de restauración.
Consulta cómo ejecutar tu primer script si no conoces el shebang o los permisos, y la lección de tar para practicar archivos. El manual de GNU tar documenta el comportamiento completo.
Referencias
Estos enlaces de documentación aportan detalles confiables sobre los comandos usados en este artículo.
Siguiente
Practique el movimiento de directorios de padres e hijos hasta que los cambios de ruta se sientan automáticos.