rsync – ¿Cómo puedo sincronizar un conjunto de subdirectorios?

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

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

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

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım