rsync : exemples de synchronisation de fichiers et de sauvegardes sous Linux
rsync copie et synchronise les fichiers en local comme par SSH, en ne transférant que les modifications. La commande de base est rsync -avz source/ user@hôte:/chemin/ : -a conserve les droits et les dates, -v affiche les fichiers, -z compresse le trafic ; --delete rend la destination identique à la source, et -n permet de vérifier le résultat sans rien modifier.
rsync est l'outil standard de Linux pour copier et synchroniser des fichiers : en local, entre disques et entre serveurs via SSH. Sa principale différence avec cp et scp : il ne transfère que ce qui a changé, si bien qu'une nouvelle synchronisation d'un gros répertoire prend quelques secondes. Vous trouverez ci-dessous des exemples rsync pour les tâches courantes : déployer un projet sur un serveur, faire un miroir de répertoire, appliquer des exclusions, réaliser des sauvegardes avec instantanés et lancer la synchronisation planifiée.
Syntaxe et options indispensables
La forme générale de la commande :
rsync [options] SOURCE... DESTINATION
La source et la destination peuvent être des chemins locaux ou distants au format utilisateur@hôte:/chemin. L'un des deux côtés doit obligatoirement être local : rsync ne copie pas directement d'une machine distante vers une autre.
| Option | Ce qu'elle fait |
|---|---|
-a | mode archive : récursif, en conservant les droits, le propriétaire, le groupe, la date de modification et les liens symboliques (équivaut à -rlptgoD) |
-v | afficher la liste des fichiers transférés |
-z | compresser les données pendant le transfert réseau |
-h | tailles lisibles (K, M, G) |
-P | équivalent de --partial --progress : progression et reprise des fichiers interrompus |
-n, --dry-run | simulation : afficher ce qui serait fait, sans rien modifier |
--delete | supprimer dans la destination les fichiers absents de la source |
--exclude | ne pas copier les fichiers correspondant à un motif |
-e | définir le shell distant, par exemple -e "ssh -p 2222" |
-H, -A, -X | conserver les liens physiques, les ACL et les attributs étendus (non inclus dans -a) |
En pratique, dans neuf cas sur dix, rsync -avh en local et rsync -avzh sur le réseau suffisent.
Le slash final du chemin : le piège principal
L'erreur la plus fréquente des débutants concerne le slash final de la source. C'est lui qui détermine ce qui est copié : le répertoire lui-même, ou seulement son contenu.
# Copier le RÉPERTOIRE project dans /backup → on obtient /backup/project/...
rsync -av project /backup/
# Copier le CONTENU de project dans /backup → les fichiers se trouvent directement dans /backup/
rsync -av project/ /backup/
Retenez simplement : un slash final sur la source signifie « le contenu de ce répertoire ». Il n'a pas d'effet sur la destination. En cas de doute, ajoutez -n et regardez les chemins que rsync prévoit de créer.
Copie en local
Copier un répertoire sur un disque externe avec la progression affichée :
rsync -avhP ~/photos/ /mnt/usb/photos/
Relancer la même commande ne recopie pas tout : rsync compare la taille et la date de modification des fichiers et ne transfère que les nouveaux et les modifiés. La fin de la sortie indique la quantité de données réellement envoyée :
sending incremental file list
2026/10/IMG_2041.jpg
4.12M 100% 38.40MB/s 0:00:00 (xfr#1, to-chk=0/1534)
sent 4.13M bytes received 9.25K bytes 2.76M bytes/sec
total size is 6.82G speedup is 1,648.21
La valeur speedup indique combien de fois moins de données ont été transférées par rapport à une copie complète.
rsync par SSH : envoyer vers un serveur et récupérer
Pour les chemins distants, rsync utilise SSH par défaut : aucune configuration supplémentaire n'est nécessaire, il suffit que la connexion ssh classique fonctionne. La solution la plus pratique reste l'authentification par clé : aucun mot de passe n'est demandé, et la commande peut être planifiée dans cron.
# Envoyer le site sur le serveur
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/
# Récupérer les journaux du serveur sur votre machine
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/
# SSH sur un port non standard et avec une clé précise
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/
rsync doit être installé sur les deux machines, car côté distant il est lancé via SSH. S'il est absent, vous verrez rsync: command not found : installez le paquet (sudo apt install rsync ou sudo dnf install rsync).
Si l'hôte est défini dans ~/.ssh/config sous un alias, rsync le reconnaît : rsync -avz ./site/ prod:/var/www/site/.
Droits root nécessaires sur le serveur
Lorsque les fichiers de destination appartiennent à root alors que vous vous connectez avec un utilisateur ordinaire, vous pouvez lancer rsync distant via sudo :
rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/
Pour que cela fonctionne, sudo doit autoriser rsync sans mot de passe sur le serveur (règle dans sudoers), sinon la commande reste bloquée en attente de saisie.
Miroir d'un répertoire : --delete
Par défaut, rsync ajoute et met à jour les fichiers, mais ne supprime rien. Pour que la destination devienne une copie exacte de la source, il faut --delete :
rsync -avh --delete ~/projects/ /mnt/backup/projects/
C'est une option puissante et dangereuse. Une erreur de chemin (une source vide ou un slash oublié) peut effacer les données de la destination. Il y a donc une règle simple : lancez toujours une commande avec --delete d'abord avec -n.
$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py
sent 1.20K bytes received 64 bytes 2.53K bytes/sec
total size is 18.4M speedup is 14,554.39 (DRY RUN)
Les lignes deleting indiquent ce qui sera supprimé. Une fois certain que tout est correct, relancez la commande sans -n.
Variantes utiles : --delete-after supprime les fichiers après le transfert (la destination reste complète plus longtemps), --backup --backup-dir=/mnt/backup/deleted-$(date +%F) ne supprime pas, mais déplace les fichiers effacés ou remplacés dans un répertoire séparé.
Exclusions : --exclude et --include
Exclure les fichiers temporaires, les dépendances et les secrets est une pratique courante lors des déploiements et des sauvegardes.
# Plusieurs motifs
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/
# Motifs lus depuis un fichier
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/
Le fichier .rsyncignore est une simple liste de motifs, un par ligne :
.git/
node_modules/
*.log
.env
tmp/
Fonctionnement des motifs :
- Un motif sans slash initial (
*.log) correspond à n'importe quelle profondeur. - Un motif commençant par un slash (
/tmp/) est ancré à la racine du transfert : il n'exclut que letmpde premier niveau. - Un slash final (
cache/) signifie « uniquement un répertoire ». - Les règles sont examinées dans l'ordre, et c'est la première correspondance qui s'applique.
De ce dernier point découle une astuce pour « ne copier que le nécessaire » : d'abord autoriser, puis interdire le reste.
# Copier uniquement les fichiers .conf en conservant l'arborescence
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/
Ici, --include='*/' est nécessaire pour que rsync parcoure tous les sous-répertoires. Ajoutez --prune-empty-dirs (-m) pour ne pas créer de dossiers vides.
Sauvegardes avec rsync
Copie quotidienne simple
Une sauvegarde minimale du répertoire personnel sur un second disque :
rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/
L'inconvénient de cette approche : une seule version est conservée. Si un fichier a été endommagé et que la sauvegarde s'est synchronisée entre-temps, l'ancienne version est perdue.
Instantanés incrémentiels avec --link-dest
L'option --link-dest résout ce problème presque sans coût d'espace. Les fichiers inchangés ne sont pas copiés, mais créés comme liens physiques vers les fichiers de l'instantané précédent. Chaque instantané ressemble à une copie complète, mais n'occupe que la place des modifications.
#!/bin/bash
set -euo pipefail
SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"
mkdir -p "$DEST"
rsync -aH --delete \
--exclude='.cache/' \
--link-dest="$DEST/latest" \
"$SRC" "$DEST/$TODAY"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
Lors de la première exécution, le lien latest n'existe pas encore : rsync affiche un avertissement et réalise une copie complète, c'est normal. Les anciens instantanés se suppriment avec un simple rm -rf : les fichiers référencés par d'autres instantanés ne disparaissent pas.
Pour supprimer les instantanés de plus de 30 jours :
find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +
Sauvegarde d'un serveur vers une autre machine
Il est préférable de choisir le sens « depuis le serveur de sauvegarde vers le serveur de production » : la machine de sauvegarde vient chercher les données elle-même, et le serveur de production n'a aucun accès en écriture aux copies. Si ce serveur est compromis, les sauvegardes restent intactes.
rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
backup@web01:/var/www/ /srv/backups/web01/www/
Attention : on ne peut pas copier ainsi des bases de données. Les fichiers d'un SGBD en fonctionnement ne sont pas cohérents pendant la copie. Réalisez d'abord un export (mysqldump, pg_dump) et laissez rsync transférer le fichier d'export obtenu.
Exécution planifiée avec cron
Le script de sauvegarde s'ajoute à cron avec la commande crontab -e :
# Tous les jours à 03h15, sortie dans un journal
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Points à vérifier pour que la sauvegarde lancée par cron fonctionne réellement :
- Le script utilise des chemins absolus : cron dispose d'un
PATHminimal et d'un répertoire courant différent. - La clé SSH n'est pas protégée par mot de passe, et l'hôte figure déjà dans
known_hosts— sinon rsync reste bloqué sur la question de l'authenticité de l'hôte. - Le script contrôle le code de retour : rsync renvoie 0 en cas de succès, 23 si certains fichiers n'ont pas pu être transférés, 24 si des fichiers ont disparu pendant la copie.
- Pour éviter que deux copies tournent en même temps, utilisez
flock:flock -n /tmp/backup.lock /usr/local/bin/backup.sh.
Au lieu de cron, vous pouvez utiliser un timer systemd : il écrit la sortie dans le journal, et les résultats se consultent facilement avec journalctl.
Options utiles pour les gros transferts
| Besoin | Option |
|---|---|
| Limiter le débit pour ne pas saturer la liaison | --bwlimit=5M |
| Reprendre un gros fichier après une coupure | -P (ou --partial) |
| Progression globale au lieu de la liste des fichiers | --info=progress2 |
| Comparer le contenu plutôt que la date | -c (--checksum), plus lent |
| Ne pas toucher aux fichiers plus récents dans la destination | -u (--update) |
| Ne pas écraser les fichiers existants | --ignore-existing |
| Supprimer les fichiers source après transfert (déplacement) | --remove-source-files |
| Statistiques détaillées à la fin | --stats |
Erreurs fréquentes et solutions
Permission deniedà l'écriture — l'utilisateur n'a pas les droits sur le répertoire de destination. Vérifiez le propriétaire du répertoire ou utilisez--rsync-path="sudo rsync".- Les fichiers sont recopiés à chaque fois — la date de modification n'est pas conservée. Vérifiez la présence de
-aou-t; sur FAT/exFAT, ajoutez--modify-window=2, car ces systèmes de fichiers stockent les dates à deux secondes près. - Erreurs
chownouchgrplors d'une copie sur clé USB ou partage réseau — le système de fichiers ne gère pas les propriétaires. Remplacez-apar-rlt. - Imbrication inattendue
/backup/project/project— slash final de la source oublié ou placé au mauvais endroit. connection unexpectedly closed— problème SSH, ou rsync n'est pas installé côté distant. Vérifiez une connexionsshclassique et la présence dersyncsur le serveur.
Conclusion
Pour le travail quotidien, quelques commandes suffisent : rsync -avz src/ hôte:/dst/ pour une copie par SSH, --delete accompagné d'un essai préalable avec -n pour un miroir, --exclude pour écarter le superflu et --link-dest pour des sauvegardes avec instantanés. Surveillez le slash final de la source, et rsync devient le moyen le plus fiable de transférer des fichiers entre machines. La synchronisation et la sauvegarde sont détaillées en pratique dans le cours Linux.
Questions fréquentes
En quoi rsync est-il meilleur que scp ?
scp recopie les fichiers en entier à chaque fois, alors que rsync ne transfère que les modifications, sait reprendre un transfert, supprimer le superflu dans la destination et exclure des fichiers selon des motifs. Pour copier un seul fichier une fois, la différence est minime ; pour une synchronisation régulière, rsync est nettement plus rapide.
Peut-on utiliser rsync sous Windows ?
Oui, via WSL, où rsync s'installe comme sous un Linux classique, ou via Cygwin. Pour synchroniser une machine Windows avec un serveur Linux, WSL est le plus pratique.
rsync chiffre-t-il les données transférées ?
rsync lui-même ne chiffre rien, mais lorsqu'il passe par SSH, tout le trafic circule dans une connexion chiffrée. Sans chiffrement, les données ne transitent que dans le cas d'un démon rsync accédé par une adresse du type rsync://.
Comment vérifier que la copie est identique à l'original ?
Lancez rsync -avnc source/ destination/ : avec -c, les fichiers sont comparés par somme de contrôle, et -n ne modifie rien. Si la liste de fichiers est vide, les copies sont identiques.
Que se passe-t-il si je interromps rsync en plein transfert ?
Les fichiers déjà transférés restent, et le fichier en cours est supprimé par défaut. Relancer la même commande reprend là où elle s'est arrêtée ; avec -P, la partie déjà reçue du fichier interrompu est conservée.
Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».
Voir le cours