GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de las opciones de inclusión y exclusión de Rsync para incluir el directorio y el archivo por patrón

Aquí está mi respuesta "enseñar a una persona a pescar":

La sintaxis de Rsync definitivamente no es intuitiva, pero vale la pena entenderla.

  1. 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.

  1. 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/ . En 1260000000/ , 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.


Linux
  1. buscar y copiar archivos usando Bash

  2. ¿Cómo usar el comando 'cp' para excluir un directorio específico?

  3. Cree un archivo zip e ignore la estructura del directorio

  4. Usando rz y sz bajo Linux Shell

  5. grep pares de patrones y archivo

Colaborar en un archivo usando Linux diff y patch

Cómo excluir archivos y directorios con Rsync

Cómo copiar archivos y directorios en Linux

Cómo hacer una copia de seguridad de archivos y directorios usando Rsync en Linux

¿Buena combinación de navegador de archivos gráfico y de línea de comandos?

Administre directorios y permisos de archivos con chmod Recursive