Aquí está mi respuesta "enseñar a una persona a pescar":
La sintaxis de Rsync definitivamente no es intuitiva, pero vale la pena entenderla.
- Primero, usa
-vvv
para ver la información de depuración de 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 *
El concepto clave aquí es que rsync aplica los patrones de inclusión/exclusión para cada directorio de forma recursiva. Tan pronto como coincida la primera inclusión/exclusión, el procesamiento se detiene.
El primer directorio que evalúa es /Storage/uploads
. Storage/uploads
tiene 1280000000/, 1260000000/, 1270000000/
directorios/archivos. Ninguno de ellos coincide con file_11*.jpg
para incluir. Todos coinciden con *
excluir. Por lo tanto, se excluyen y finaliza rsync.
- La solución es incluir todos los directorios (
*/
) primero. Entonces el primer componente dir será1260000000/, 1270000000/, 1280000000/
ya que coinciden con*/
. El próximo componente dir será1260000000/
. En1260000000/
,file_11_00.jpg
coincide con--include="file_11*.jpg"
, por lo que está incluido. Y así sucesivamente.
$ 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
El problema es que --exclude="*"
dice que se excluya (por ejemplo) el 1260000000/
directorio, entonces rsync
nunca examina el contenido de ese directorio, por lo que nunca se da cuenta de que el directorio contiene archivos que habrían coincidido con su --include
.
Creo que lo más parecido a lo que quieres es esto:
rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
(que incluirá todos los directorios y todos los archivos que coincidan con file_11*.jpg
, pero ningún otro archivo), o tal vez esto:
rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
(Mismo concepto, pero mucho más exigente con los directorios que incluirá).
rsync
incluir ejemplos de patrones de exclusión:
"*" 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...
Y la nota final es que simplemente no confíe en los asteriscos que se usan al principio para evaluar rutas; como "**dir"
(está bien usarlos para carpetas o archivos individuales, pero no para rutas) y tenga en cuenta que más de dos asteriscos no funcionan para los nombres de archivo.