← retour aux snippets

rsync: synchronisation sûre avec progression

Copier ou mirrorer des dossiers avec reprise, suppression des orphelins et affichage de la progression.


objectif

Synchroniser des répertoires en local ou via SSH de façon fiable, avec reprise sur coupure, suppression des fichiers obsolètes et sortie lisible.

code minimal

# mirroring local → distant via SSH avec progression et reprise
rsync -a --delete --human-readable --info=progress2 \
  --partial --partial-dir=.rsync-partial \
  -e 'ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3' \
  ./src/ user@serveur:/data/src/

utilisation

# dry-run sécurisé pour voir les changements
rsync -a --delete --human-readable --itemize-changes -n \
  ./src/ user@serveur:/data/src/

# synchronisation locale (même disque ou disques différents)
rsync -a --delete --human-readable --info=progress2 \
  ./src/ ./dest/

# exclure des fichiers/dossiers courants
rsync -a --delete --human-readable --info=progress2 \
  --exclude '.git/' --exclude 'node_modules/' --exclude '*.tmp' \
  ./src/ user@serveur:/data/src/

# compression réseau (utile sur liens lents)
rsync -a --delete --human-readable --info=progress2 -z \
  ./src/ user@serveur:/data/src/

variante(s) utile(s)

# préserver hardlinks, ACL et xattrs quand c'est pertinent
rsync -aHAX --delete --human-readable --info=progress2 \
  ./src/ ./dest/

# si vous n'avez pas les droits pour préserver owner/group
rsync -a --no-owner --no-group --delete --human-readable --info=progress2 \
  ./src/ user@serveur:/data/src/

# limiter la bande passante (KB/s)
rsync -a --delete --human-readable --info=progress2 --bwlimit=5000 \
  ./src/ user@serveur:/data/src/

# utiliser un fichier de filtres (plus lisible que des --exclude en série)
# contenu de .rsync-filter (exemple):
# - .git/
# - node_modules/
# - *.tmp
rsync -a --delete --human-readable --info=progress2 --filter='merge .rsync-filter' \
  ./src/ user@serveur:/data/src/

notes

  • le slash final compte: ./src/ copie le contenu de src dans la cible; ./src crée un dossier src dans la cible.
  • --delete supprime dans la cible ce qui n’existe plus dans la source; combinez avec -n en amont pour vérifier.
  • --partial et --partial-dir=.rsync-partial permettent de reprendre un transfert interrompu proprement.
  • mettez la cible sur le même système de fichiers pour profiter au mieux de la sécurité des opérations; sinon rsync gère les copies.
  • si le lien est instable, combinez -z avec l’option SSH de keepalive dans -e 'ssh ...'.