Voici ma réponse "apprendre à pêcher à quelqu'un":
La syntaxe de Rsync n'est certainement pas intuitive, mais elle mérite d'être comprise.
- Tout d'abord, utilisez
-vvv
pour voir les informations 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 modèles d'inclusion/exclusion pour chaque répertoire de manière récursive. Dès que la première inclusion/exclusion correspond, le traitement s'arrête.
Le premier répertoire qu'il évalue est /Storage/uploads
. Storage/uploads
a 1280000000/, 1260000000/, 1270000000/
répertoires/fichiers. Aucun d'eux ne correspond à file_11*.jpg
inclure. Tous correspondent à *
exclure. Ils sont donc exclus et rsync se termine.
- La solution consiste à inclure tous les répertoires (
*/
) première. Ensuite, le premier composant dir sera1260000000/, 1270000000/, 1280000000/
puisqu'ils correspondent à*/
. Le prochain composant dir sera1260000000/
. En1260000000/
,file_11_00.jpg
correspond à--include="file_11*.jpg"
, il est donc 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
Le problème est que --exclude="*"
dit d'exclure (par exemple) le 1260000000/
répertoire, 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é mis en correspondance avec 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 pointilleux sur les répertoires qu'il inclura).
rsync
inclure des exemples de modèles 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 note finale est que ne vous fiez tout simplement pas aux astérisques qui sont utilisés au début pour évaluer les chemins; comme "**dir"
(il est possible de les utiliser pour des dossiers ou des fichiers uniques, mais pas pour des chemins) et notez que plus de deux astérisques ne fonctionnent pas pour les noms de fichiers.