Écrire un script de sauvegarde Bash plus sûr avec tar
Créez une sauvegarde Bash qui valide la source, évite l'écrasement, supprime les archives partielles et vérifie le fichier tar.
Démarrer la leçon interactiveUn bon script de sauvegarde doit refuser une source absente, placer la destination hors de cette source, éviter d'écraser une archive, supprimer les sorties partielles après un échec et contrôler l'archive avant d'annoncer le succès. Cet exemple pédagogique crée une archive tar compressée avec ces protections. Il ne remplace pas un système complet. La leçon de scripting Bash permet d'en assembler les éléments.
Définir clairement source et destination
Enregistrez ce contenu dans 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"
Le premier argument choisit la source et le second le dossier des archives. Sans argument, le script utilise $HOME/data et $HOME/backups. La destination reste hors de la source pour ne pas archiver sa propre sortie.
Comprendre les protections
set -euo pipefail arrête cette séquence lors d'un échec non géré, d'une variable absente ou d'une commande de pipeline en erreur. Les cas d'échec attendus doivent néanmoins être traités explicitement.
Le test du dossier s'arrête avant tar si la source manque. L'horodatage évite un nom fixe et le test d'existence refuse une collision. Le script écrit d'abord un fichier .partial. Le trap EXIT le supprime si une commande échoue. Seule une archive lisible prend le nom final.
Pourquoi tar emploie -C
tar -czf "$partial" -C "$source_parent" "$source_name"
Les options créent (c), compressent avec gzip (z) et écrivent dans le fichier suivant (f). -C change de dossier pendant l'opération afin de ne pas stocker un chemin absolu.
Listez la structure :
tar -tzf "$archive"
Ce contrôle prouve que tar peut lire l'archive, pas que chaque fichier est à jour ni qu'une restauration répondra au besoin.
Exécuter et tester la restauration
bash -n backup.sh
bash backup.sh "$HOME/data" "$HOME/backups"
Restaurez ensuite dans un dossier temporaire :
restore_dir=$(mktemp -d)
tar -xzf "$HOME/backups/data-YYYYMMDD-HHMMSS.tar.gz" -C "$restore_dir"
find "$restore_dir" -type f
Remplacez le nom d'exemple par celui affiché. Une stratégie réelle exige aussi une destination indépendante, une politique de conservation, une surveillance, des identifiants protégés et des tests de restauration réguliers.
Relisez le premier script Bash pour le shebang et les droits, puis la leçon tar pour les archives. Le manuel GNU tar fournit les règles complètes.
Références
Ces liens de documentation fournissent des informations fiables sur les commandes utilisées dans cet article.
À suivre
Entraînez-vous à déplacer les répertoires enfants et parents jusqu'à ce que les changements de chemin semblent automatiques.