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"
- No te saltes ningún directorio
- No salte ningún archivo
.sh
- Omitir todo
- (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.