CMD Master
Retour au blog
•Mis à jour•Arnošt Havelka

É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 interactive
Écrire un script de sauvegarde Bash plus sûr avec tar

Un 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

Orientation Bash : boucle de CD

Entraînez-vous à déplacer les répertoires enfants et parents jusqu'à ce que les changements de chemin semblent automatiques.