usuario usar sincronizar remoto orden opciones incremental fondo encontró contraseña con como comando archivos linux bash shell rsync

linux - usar - rsync remoto



rsync copia solo ciertos tipos de archivos usando la opción incluir (4)

Utilizo el siguiente script bash para copiar solo archivos de cierta extensión (en este caso * .sh), sin embargo, sigue copiando sobre todos los archivos. ¿Qué pasa?

from=$1 to=$2 rsync -zarv --include="*.sh" $from $to


Aquí está la parte importante de la página man:

Como la lista de archivos / directorios a transferir está construida, rsync verifica cada nombre para ser transferido contra la lista de patrones de inclusión / exclusión a su vez, y se actúa sobre el primer patrón coincidente: si es un patrón de exclusión, entonces ese archivo es omitido; si es un patrón de inclusión, entonces ese nombre de archivo no se salta; si no se encuentra un patrón coincidente, entonces el nombre de archivo no se salta.

Para resumir:

  • ¡No coincidir con ningún patrón significa que se copiará un archivo!
  • El algoritmo se cierra una vez que cualquier patrón coincide

Además, algo que termina con una barra diagonal coincide con directorios (como find -type d would).

Vamos a separar esta respuesta de arriba.

rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"

  1. No te saltes ningún directorio
  2. No salte ningún archivo .sh
  3. Omitir todo
  4. (Implícitamente, no omita nada, pero la regla anterior impide que la regla predeterminada ocurra).

Finalmente, el --prune-empty-directories evita que la primera regla --prune-empty-directories directorios vacíos por todos lados.


Creo que --include se usa para incluir un subconjunto de archivos que de otra manera están excluidos por --exclude , en lugar de incluir solo esos archivos. En otras palabras: debes pensar en incluir significado no excluir .

Intente en su lugar:

rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

Para rsync versión 3.0.6 o superior, la orden debe modificarse de la siguiente manera (ver comentarios):

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

Agregar el -m evitará crear estructuras de directorio vacías en el destino. Probado en la versión 3.1.2.

Entonces, si solo queremos archivos * .sh, debemos excluir todos los archivos --exclude="*" , incluir todos los directorios --include="*/" e incluir todos los archivos * .sh --include="*.sh" .

Puede encontrar algunos buenos ejemplos en la sección Incluir / Excluir reglas de patrones de la página de manual


La respuesta de @chepner copiará todos los subdirectorios independientemente del hecho si contiene el archivo o no. Si necesita excluir los subdirectorios que no contienen el archivo y aún retienen la estructura del directorio, use

rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"


Una adición más: si necesita sincronizar archivos por sus extensiones en un solo directorio (sin recurrencia), debe usar una construcción como esta:

rsync -auzv --include ''./'' --include ''.ext'' --exclude ''*'' /source/dir/ /destination/dir/

Preste atención al punto en el primer --include . --no-r no funciona en esta construcción.