Pregunta:
Tengo un directorio de origen que se parece al siguiente (con numerosos subdirectorios dentro de los directorios src y bin):
- top_dir
- proj1
- src /
- compartimiento/
- guiones/
- somefile.txt
- proj2
- src /
- compartimiento/
- objetivo
- compartimiento/
- file.xml
- proj1
Me gustaría sincronizar solo los directorios bin directamente debajo de los directorios del proyecto (es decir, ignorar top_dir / proj2 / target / bin /) y su contenido en el directorio de destino, para que se vea así:
- top_dir
- proj1
- compartimiento
- proj2
- compartimiento
- proj1
Probablemente podría hacer que funcione enumerando explícitamente cada directorio bin (hay alrededor de 15 en mi escenario real) en un archivo de inclusión, pero estaba pensando que debe haber una manera de decir que quiero sincronizar todos los top_dir / * Directorios / bin.
Respuesta:
Posibilidad 1
Sin usar las reglas de filtro de rsync, pero la expansión del shell * puede hacer:
una. Para incluir todos los top_dir
bin
en la jerarquía top_dir
:
rsync -av -R top_dir/**/bin/ destination_path
Aquí -R
es un parámetro rsync que significa relativo y significa que la estructura del directorio se conserva.
**
es un patrón globular de shell y busca de forma recursiva directorios denominados bin
en top_dir
. Entonces, con el ejemplo anterior, la línea de comando se expande a:
rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path
B. Si solo desea incluir los directorios bin
un nivel por debajo del directorio del proyecto, solo use un solo *
(¡que también funciona con shells "antiguos"!):
rsync -av -R top_dir/*/bin/ destination_path
* Necesita una versión reciente de bash (> 4) y activar el globbing recursivo a través de shopts -s globstar
. Con zsh, el globbing recursivo es predeterminado.
Posibilidad 2
Solo usando las reglas de filtro de rsync necesitas:
una. Para incluir todos los top_dir
bin
en la jerarquía top_dir
:
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
La primera regla de inclusión puede no ser obvia + , pero garantiza que se busquen todos los directorios (tenga en cuenta el /
al final), la segunda finalmente agrega todo en los directorios bin
y la regla de exclusión excluye todo lo demás. -m
se asegura de que los directorios vacíos no se copien.
B. Solo un nivel por debajo del directorio del proyecto:
rsync -av -m --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path
Usando la sintaxis ***
de rsync> = 2.6.7. El /
top_dir
en los patrones representa top_dir
; de lo contrario, los patrones se top_dir
con el final de la ruta del archivo.
+ Buscar /some/path/this-file-will-not-be-found
en man rsync