web-dev-qa-db-fra.com

Utilisation des options d'inclusion et d'exclusion de Rsync pour inclure un répertoire et un fichier par modèle

Je ne parviens pas à bien interpréter ma syntaxe rsync et je me demande si mon scénario peut réellement être géré avec rsync. Tout d'abord, j'ai confirmé que rsync fonctionnait parfaitement entre mon hôte local et mon hôte distant. La 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 commençant par "fichier_11_" dans les sous-répertoires. Je souhaite pouvoir exécuter un seul travail rsync pour synchroniser tous ces fichiers dans les sous-répertoires.

Voici la commande que j'essaye:

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

Il en résulte que 0 fichiers sont marqués pour le transfert dans mon essai. J'ai essayé diverses autres combinaisons d'instructions --include et --exclude, mais j'ai continué à ne pas obtenir de résultats ou tout obtenu comme si aucune option d'inclusion ou d'exclusion n'était définie.

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

58
Sheldon Chang

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

Je pense que la chose la plus proche de ce que vous voulez est la suivante:

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

(qui inclura tous les répertoires et tous les fichiers correspondant à file_11*.jpg, mais pas d’autres fichiers), 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 sélectif quant aux répertoires qu’il inclura).

102
ruakh

rsync inclure des exemples de motif d'exclusion:

"*"         means everything
"dir1"      transfers empty directory [dir1]
"dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*"     transfers files whose names start with [file]
"dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***"    same as above
"dir1/*"    does nothing
"dir1/**"   does nothing
"dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

Et la dernière remarque est que vous ne devez simplement pas vous fier aux astérisques utilisés au début pour évaluer les chemins; comme "**dir" (il est correct de les utiliser pour des dossiers ou des fichiers uniques mais pas des chemins) et notez que plus de deux astérisques ne fonctionnent pas pour les noms de fichiers.

19
AmirHossein

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

8
brandon