103 votes

Utilisation des options include et exclude de Rsync pour inclure un répertoire et un fichier par motif

Je rencontre des problèmes pour obtenir la bonne syntaxe de mon rsync et je me demande si mon scénario peut en fait être géré avec rsync. Tout d'abord, j'ai confirmé que rsync fonctionne parfaitement entre mon hôte local et mon hôte distant. Une synchronisation directe sur un répertoire est réussie.

Voici à quoi ressemble mon système de fichiers :

uploads/
  1260000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1270000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1280000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg

Ce que je veux faire, c'est exécuter rsync uniquement sur les fichiers qui commencent par "file_11_" dans les sous-répertoires et je veux pouvoir exécuter un seul travail rsync pour synchroniser tous ces fichiers dans les sous-répertoires.

Voici la commande que j'essaie :

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

Cela se traduit par 0 fichiers marqués pour transfert dans mon essai à sec. J'ai essayé diverses autres combinaisons d'instructions --include et --exclude, mais j'ai soit continué à ne rien obtenir en résultats, soit tout obtenu comme si aucune option d'inclusion ou d'exclusion n'était définie.

Quelqu'un a une idée de comment faire cela ?

155voto

ruakh Points 68789

Le problème est que --exclude="*" indique d'exclure (par exemple) le répertoire 1260000000/, donc rsync n'examine jamais le contenu de ce répertoire, donc ne remarque jamais que le répertoire contient des fichiers qui auraient été correspondants à votre --include.

Je pense que ce qui se rapproche le plus de ce que vous voulez est ceci :

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(ce qui inclura tous les répertoires et tous les fichiers correspondant à file_11*.jpg, mais aucun autre fichier), ou peut-être ceci :

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(même concept, mais beaucoup plus exigeant sur les répertoires qu'il inclura).

Dans les deux cas, notez que l'option --include=... doit être placée avant l'option --exclude=..., car nous avons besoin que la première prenne le dessus sur la seconde lorsque qu'un fichier correspond aux deux motifs.

83voto

TechJS Points 1628

rsync incluent des exemples de motifs d'inclusion et d'exclusion :

"*" signifie tout
"dir1" transfère le répertoire vide [dir1]
"dir*" transfère les répertoires vides comme : "dir1", "dir2", "dir3", etc...
"file*" transfère les fichiers dont les noms commencent par [file]
"dir**" transfère tous les chemins qui commencent par [dir] comme "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***" même chose que ci-dessus
"dir1/*" ne fait rien
"dir1/**" ne fait rien
"dir1/***" transfère le répertoire [dir1] et tous ses contenus comme "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

Et enfin, notez simplement de ne pas vous fier aux astérisques utilisés au début pour évaluer les chemins ; par exemple "**dir" (il est possible de les utiliser pour des dossiers ou fichiers uniques mais pas pour des chemins) et notez que plus de deux astérisques ne fonctionnent pas pour les noms de fichiers.

29voto

wisbucky Points 829

Voici ma réponse "apprendre à pêcher" :

La syntaxe de Rsync est définitivement non-intuitive, mais cela vaut la peine de la comprendre.

  1. Tout d'abord, utilisez -vvv pour voir les infos de débogage pour rsync.

    $ rsync -nr -vvv --include="*/file_11.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

    [sender] hiding directory 1280000000 because of pattern [sender] hiding directory 1260000000 because of pattern [sender] hiding directory 1270000000 because of pattern *

Le concept clé ici est que rsync applique les motifs d'inclusion/exclusion pour chaque répertoire de manière récursive. Dès qu'une inclusion/exclusion est trouvée, le traitement s'arrête.

Le premier répertoire évalué est /Storage/uploads. Storage/uploads a les répertoires/fichiers 1280000000/, 1260000000/, 1270000000/. Aucun d'entre eux ne correspond à file_11*.jpg pour l'inclure. Tous correspondent à * pour l'exclure. Donc ils sont exclus, et rsync se termine.

  1. La solution est d'inclure tous les répertoires (*/) en premier. Ensuite, le premier composant de répertoire sera 1260000000/, 1270000000/, 1280000000/ puisqu'ils correspondent à */. Le prochain composant sera 1260000000/. Dans 1260000000/, file_11_00.jpg correspond à --include="file_11*.jpg", donc il est inclus. Et ainsi de suite.

    $ rsync -nrv --include='/' --include="file_11.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

    ./ 1260000000/ 1260000000/file_11_00.jpg 1260000000/file_11_01.jpg 1270000000/ 1270000000/file_11_00.jpg 1270000000/file_11_01.jpg 1280000000/ 1280000000/file_11_00.jpg 1280000000/file_11_01.jpg

https://download.samba.org/pub/rsync/rsync.1

14voto

Ron Points 23

Ajoutez -m à la réponse recommandée ci-dessus pour élaguer les répertoires vides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X