Le paramètre exclude de rsync1 min read

Rien de tel qu’une belle commande rsync de trois kilomètres de long pour faire ses backups… excepté quand on veut exclure certains dossiers et que ça ne fonctionne pas. Et qu’on perd une heure à s’arracher les cheveux avant de comprendre pourquoi. Voici un exemple (factice) erroné:
rsync --archive --verbose --stats --progress --delete --delete-excluded --exclude="/home/jeff/src/" /home/jeff/ /media/backup/
On pourrait croire, selon le gros-bon-sens, que ceci est syntaxiquement correct. D’ailleurs, le manpage de rsync ne dit rien à ce sujet. Après une heure de tâtonnement, j’ai eu le insight par rapport à la raison pourquoi cet idiot de rsync continuait de backuper le dossier «src» quand même: la racine (“/”) est relative au dossier racine qu’on backupe. Ainsi, si je backupe “/home/jeff/”, “/” ne correspond pas réellement à “/”, mais à “/home/jeff/”. Conséquemment, si je veux exclure “/home/jeff/src”, il faut que je lui dise d’exclure “/src” plutôt.
Allez, geeks barbus, dites-moi que c’est parfaitement naturel et logique et que j’aurais dû le deviner immédiatement 🙂
…en fait, ce n’est pas tout. Je découvre en rédigeant ces lignes que rsync a, en plus, deux «modes» d’opération, dépendamment de si on met un “/” à la fin du chemin de dossier source ou pas. Tiré du manuel:

A trailing slash on the source changes this behavior to transfer all files from the directory src/bar on the machine foo into the /data/tmp/.
A trailing / on a source name means “copy the contents of this directory”.
Without a trailing slash it means “copy the directory”.

Jeff

Comments

5 responses to “Le paramètre exclude de rsync”

  1. Nico Avatar
    Nico

    Ha ben merci pour le tips! jvais pouvoir enlever 3 lignes de exclude à mes rsync!

  2. Hello,
    Oui oui en effet le paramètre –exclude exclue un “masque” et non un chemin donc le hic c’est que si un autre rep porte ce nom dans l’arborescence et quelque soit sa profondeur, il sera exclu aussi vu qu’il correspondra à ce masque 🙁
    Sinon un –filter=”- /home/jeff/src/” spécifie bien un chemin.
    Concernant le / final, “rsync -av /foo…” copie /foo même si il doit le crée lui même sur la cible, alors que “rsync -av /foo/…” ne prendra que le contenu de /foo, idem à un /foo/* en fait.

  3. C’est parfaitement naturel et logique. Tu aurais dû le deviner immédiatement !

  4. Merci, j’avais le même soucis, mais je n’avais pas cherché à le résoudre. Est ce que tu as contacter les dev pour modifier la doc ?
    François.

  5. Pour ceux qui veulent des explications simples sur rsync je vous conseille :
    http://www.sheltem.com/?p=70