En utilisant Rsync, include et exclude les options pour inclure le répertoire et le fichier par motif

j'ai des problèmes avec ma syntaxe rsync et je me demande si mon scénario peut être géré avec rsync. Tout d'abord, j'ai confirmé que rsync fonctionne très bien entre mon hôte local et mon hôte distant. Faire une synchronisation directe sur un répertoire est un succès.

<!-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 est d'exécuter rsync seulement sur les fichiers qui commencent par "file_11_" dans les sous-répertoires et je veux pouvoir exécuter seulement un rsync tâche de 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 étant marqués pour le transfert dans mon dry run. J'ai essayé diverses autres combinaisons de déclarations --include et --exclude, mais soit j'ai continué à obtenir aucun résultat, soit j'ai obtenu tout comme si aucune option include ou exclude n'était définie.

quelqu'un aurait une idée de comment faire cela?

42
demandé sur Sheldon Chang 2012-03-31 04:40:39

3 réponses

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

je pense que la chose la plus proche de ce que vous voulez, c'est ceci:

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

(qui comprendra tous les répertoires et tous les fichiers correspondant à file_11*.jpg, mais pas les 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 difficile sur les répertoires qu'il inclura).

83
répondu ruakh 2014-08-17 15:39:29

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

7
répondu brandon 2017-01-25 17:33:08

rsync inclure exclure motif exemples:

"*"         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 dernière remarque est que, tout simplement, ne vous fiez pas sur les astérisques qui sont utilisés au début, pour évaluer les chemins; comme "**dir" (c'est ok de les utiliser pour des dossiers simples ou des fichiers mais pas des chemins) et notez que plus de deux astérisques ne fonctionnent pas pour les noms de fichiers.

7
répondu TechJS 2017-12-28 16:03:26