Maîtriser rsync pour synchroniser des fichiers en local ou à distance, créer des sauvegardes incrémentales et automatiser les transferts.
rsync est un outil de synchronisation de fichiers ultra-efficace. Il ne transfère que les différences entre la source et la destination (transfert incrémental), ce qui le rend beaucoup plus rapide que cp ou scp pour les mises à jour régulières. Il fonctionne en local et via SSH pour les transferts réseau.
rsync est pré-installé sur la plupart des distributions Linux. Pour les transferts distants, SSH doit être configuré (voir le tutoriel SSH).
# Syntaxe de base : rsync [options] source/ destination/
# Le slash final sur la source est IMPORTANT !
# Copie le contenu de /home/user/docs/ vers /backup/docs/
rsync -av /home/user/docs/ /backup/docs/
# -a = archive (préserve permissions, dates, liens symboliques)
# -v = verbose (affiche les fichiers transférés)
# Avec le slash : copie le CONTENU du dossier
rsync -av /home/user/docs/ /backup/docs/
# Résultat : /backup/docs/fichier1.txt
# Sans le slash : copie le DOSSIER lui-même
rsync -av /home/user/docs /backup/
# Résultat : /backup/docs/fichier1.txt (crée le sous-dossier)
source/ (avec slash) et source (sans slash) est cruciale. Testez toujours avec --dry-run d'abord.
# Envoie des fichiers locaux vers un serveur distant
rsync -avz /home/user/projet/ user@serveur:/backup/projet/
# -z = compresse les données pendant le transfert (plus rapide sur réseau lent)
# Récupère des fichiers depuis un serveur distant
rsync -avz user@serveur:/var/www/html/ /home/user/backup-site/
# Spécifie un port SSH personnalisé
rsync -avz -e "ssh -p 2222" /home/user/data/ user@serveur:/backup/
# Avec une clé SSH spécifique (pas de mot de passe demandé)
rsync -avz -e "ssh -i ~/.ssh/id_backup" /data/ user@serveur:/backup/
# Limite la bande passante à 5 Mo/s (pour ne pas saturer le réseau)
rsync -avz --bwlimit=5000 /data/ user@serveur:/backup/
# Exclut des fichiers ou dossiers spécifiques
rsync -av --exclude='*.log' --exclude='.git' /projet/ /backup/projet/
# Exclut depuis un fichier liste (un pattern par ligne)
cat > /home/user/rsync-exclude.txt <<EOF
*.log
*.tmp
.git/
node_modules/
__pycache__/
.env
EOF
rsync -av --exclude-from='/home/user/rsync-exclude.txt' /projet/ /backup/projet/
# Inclut uniquement certains fichiers (exclut tout le reste)
rsync -av --include='*.php' --include='*.html' --exclude='*' /site/ /backup/
--dry-run (ou -n) pour simuler le transfert sans rien modifier. Idéal pour vérifier les exclusions.
#!/bin/bash
# Script de sauvegarde incrémentale avec rsync
# Garde les 7 derniers jours de backup, chaque jour ne copie que les changements
SOURCE="/var/www/"
DEST="/backup/www"
DATE=$(date +%Y-%m-%d)
LATEST="$DEST/latest"
# Crée le dossier de destination
mkdir -p "$DEST/$DATE"
# Sauvegarde incrémentale avec hard links
# --link-dest pointe vers le dernier backup : les fichiers inchangés
# seront des hard links au lieu de copies (économise de l'espace)
rsync -av --delete \
--link-dest="$LATEST" \
"$SOURCE" "$DEST/$DATE/"
# Met à jour le lien symbolique "latest" vers le dernier backup
ln -snf "$DEST/$DATE" "$LATEST"
# Supprime les backups de plus de 7 jours
find "$DEST" -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;
echo "Backup terminé : $DEST/$DATE"
# Ouvre l'éditeur crontab
crontab -e
# Ajoute une sauvegarde quotidienne à 2h du matin
0 2 * * * /home/user/scripts/backup-rsync.sh >> /var/log/rsync-backup.log 2>&1
# Sauvegarde toutes les 6 heures
0 */6 * * * rsync -az /data/ user@backup-server:/backup/data/
# Vérifie que le cron est bien enregistré
crontab -l
--delete avec prudence : cette option supprime de la destination les fichiers qui n'existent plus dans la source. Parfait pour un miroir exact, mais dangereux si vous vous trompez de sens.