Synchronisation de deux répertoires avec rsync

Rsync est un utilitaire présent sur tout les systèmes Unix (de Linux à FreeBSD en passant par Mac OS X et même sous Windows en passant par Cygwin) et ayant pour but la synchronisation de fichiers/répertoires. Cette synchronisation peut se faire soit de manière locale (par exemple deux répertoire d'un même disque) soit par le réseau (via le protocole SSH).

Un petit exemple valant mieux qu'un long discours...

Imaginons que l 'on veuille synchroniser un répertoire (/home/nicolargo/src) avec un autre stocké sur une clés USB (/media/uskkey/dst).

Le répertoire src contient 3 fichiers:

ls /home/nicolargo/src

1

2

3

Le répertoire dst est vide:

ls /media/usbkey/dst

Pour synchroniser le répertoire dst avec le contenu du répertoire src, il faut saisir la commande suivant:

rsync --delete -av /home/nicolargo/src/ /media/usbkey/dst

Attention: mettre deux - avant le delete

building file list ... done

./

1

2

3

wrote 231 bytes read 80 bytes 622.00 bytes/sec

total size is 0 speedup is 0.00

/home/nicolargo/src est le répertoire source.

/media/usbkey/dst est le répertoire destination.

L'option -a (pour archive) permet de garder les propriétés des fichiers (droits, propriétaire, lien symbolique) intactes. L'option -v (verbose) permet d'afficher ce que fait rsync pendant sont exécution.

Si vous souhaitez que rsync ne créé par un répertoire src dans le répertoire dst mais qu'il mette directement les fichiers contenus dans src, il faut penser à mettre un / à la fin du répertoire source.

On vérifie que le répertoire destination contient bien les 3 fichiers.

ls /media/usbkey/dst

1

2

3

Nous allons maintenant vérifier que la commande "delete" fonctionne correctement. L'option --delete (noté le double - avant la commande) permet de supprimer dans le répertoire destination les fichiers non présents dans le répertoire source.

Nous pouvons le tester simplement en supprimant le fichier 1 du répertoire source:

rm /home/nicolargo/src/1

Puis en re-synchronisant:

rsync --delete -av /home/nicolargo/src/ /media/usbkey/dst

Attention: mettre deux - avant le delete

building file list ... done

deleting 1

./

wrote 104 bytes read 20 bytes 248.00 bytes/sec

total size is 0 speedup is 0.00

On vérifie que le répertoire destination contient seulement 2 fichiers.

ls /media/usbkey/dst

2

3

Quelques options utiles...

Rsync fourmille d'options (je vous laisse consulter le man page pour une liste exhaustive). Voici quelques options que je trouve utile de détailler.

Synchronisation à travers un tunnel SSH

Si votre répertoire destination se trouve sur une autre machine disposant d'un serveur SSH correctement configuré (nommé serveur dans mon exemple ci-dessous), il est possible de faire une synchronisation à travers le réseau grâce à la commande suivante:

rsync --delete  -avz -e ssh /home/nicolargo/src/ serveur:/home/nicolargo/dst

Attention: mettre deux - avant le delete

J'ai ici ajouté l'option -z afin de compresser les données avant de les envoyer dans le réseau.

Utilisation de Rsync comme d'un daemon

Il est possible de lancer Rsync en mode daemon en utilisant l'option --daemon. Dans ce cas, on peut se passer d'un serveur SSH. Le daemon écoutera (sur le port TCP/873) les requêtes de synchronisation venant de machine lancant Rsync en mode client (voir la syntaxe dans les chapitre précédant).

Vous trouverez un exemple de configuration de Rsync en mode daemon ici.

Exclure des fichiers de la synchronisation

Si l'on souhaite exclure certain fichier de la synchronisation, on peut utiliser l'option --exclude.

Exemple ou l'on souhaite synchroniser tous les fichiers sauf ceux ayant pour extension .log:

rsync --delete  -av --exclude "*.log" /home/nicolargo/src/ /media/usbkey/dst

Attention: mettre deux - avant le delete et le exclude

Et si je veux simuler

Très facile Simone, il suffit d'utiliser l'option -n. Utilisée avec l'option -v, on aura la liste des fichiers qui seront copiés ou effacés...

Pour finir...

Et voilà pour cette très courte introduction à ce précieux outils. Si vous utilisez ce logiciel et que vous avez des options intéressantes à expliquer, les commentaires sont fait pour ça ;)

  • duck.nux

    Perso je préfère unison qui sait faire du bidirectionnel, de souvenir rsync n’en fait pas…

  • http://www.generation-linux.fr Benjamin

    Merci pour cet article, je pense que je vais essayer chez moi. J’ai utilisé BackupPC qui est basé sur rsync et ssh justement mais c’était pour des grosses sauvegardes.
    Pour faire une petite sauvegarde (genre de sa clé usb) de temps en temps cette ligne de commande est très pratique :)

  • http://home.raf.free.fr Raf

    J’utilise Unison à l’heure actuelle.

    Plus orienté synchronisation avec le Web 2.0, mais qui gère aussi les dossiers il y a Conduit du projet gnome.

  • Chriss

    Ça tombe bien, j’étais justement en train de chercher comment synchroniser un répertoire sur mon serveur, merci pour l’astuce.

    Et j’imagine que pour synchroniser a intervalles réguliers, faut le faire avec Cron.
    D’ailleurs je sais pas comment il marche lui non plus, ça aurait pu être intéressant de le mettre aussi

  • Alex

    Pour info, j’ai rsync 2.6.9 et il faut mettre l’argument “–delete” avant “-av” sinon il n’est pas correctement compris et les fichiers ne sont pas effacés.

    Chez moi ça donne donc :
    rsync –delete -av /home/nicolargo/src/ /media/usbkey/dst

  • http://blog.nicolargo.com NicoLargo

    @Alex: exact… merci pour l’info je fais la modif.

  • DrazX

    Dans un double sens la commande delete risque surtout de foutre la m***e dans le cas ou on a ajouter des fichiers dans la destination avant de faire la synchronisation. Est-ce que je me trompe ? Et est-ce que Unison est capable de l’éviter ? Pour ça il faudrait une indexation journalisé des synchronisations.

  • Lo

    Franchement … apprenez l’orthographe.

  • Jean

    Bonjour!
    La commande rsync -avhH –del –ignore-errors –progress –link-dest=/Volumes/SERVER_BACKUP/2011-11-24/ /volumes/BRANCHES_BULLE/ /Volumes/SERVER_BACKUP/2012-01-20/me donne ce résultat très décevant (rsync 3.0.8 sous OSX 10.6.8) :
    rsync: recv_generator: mkdir “/Volumes/SERVER_BACKUP/2012-01-20/.TemporaryItems” failed: Permission denied (13)
    *** Skipping any contents from this failed directory ***
    Et pareil pour tous les autres dossiers…. J’ai observé en direct, même si le dossier 2012-01-20 est créé à la main, il devient “lecture seulement” dès que rsync dépasse l’étape “sending incremental file list”.
    Est-ce que ça rappelle quelque chose à quelqu’un?
    Merci!

  • matu

    Merci j’avais juste besoin d’un exemple rapide pour faire exactement ce qui est démontré ici, très utile.

  • castet

    — pour synchroniser mon ‘podcast.store’ avec mon baladeur:

    loc2viv|lv) # myPodcast loc2viv |lv#{{{
    [ $2 ] && d0=$2 || d0=$PWD
    # — check out
    cat <0
    find $d0 -type f ! -empty \( -name ‘*mp3′ -or -name ‘*MP3′ \) |sort -u
    echo; echo … sleep 5 … ; sleep 5
    time find $d0 -type f ! -empty \( -name ‘*mp3′ -or -name ‘*MP3′ \) |sort -u |
    while read fa; do
    fc=${fa/$pFc3\/}
    fb=$dviv/$fc
    da=$( dirname $fb); [ -d $da ] || mkdir -p $da
    # [ ! -f $fb ] && echo $fc && cp $fa $fb
    rsync -HouralptgD $fa $fb
    done
    printf “\n0\n”
    ;;
    #}}}