2011-11-25 8 views
19

Estoy intentando copiar un proyecto en mi servidor con rsync. tengo específica del proyecto scripts de instalación en un subdirectoriorsync excluye un directorio pero incluye un subdirectorio

proyecto/especificaciones/proyecto1 instalar/

Lo que estoy tratando de hacer es excluir todo en el/especificaciones de directorio proyecto pero el proyecto específico directorio de instalación : project/specs/install/project1.

rsync -avz --delete --include=specs/install/project1 \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Pero así el contenido del directorio de especificaciones se excluye pero el directorio install/project1 no se incluye.

He intentado todo pero simplemente no parecen conseguir que esto funcione

+1

Acabo de encontrar una pregunta similar en linuxquestions.org que puede ayudar: http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris

+0

Gracias, eso resuelto ¡eso! Rsync realmente tiene una lógica extraña a veces. – user1036651

+0

Duplicados http://stackoverflow.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –

Respuesta

29

En algún momento es sólo un detalle.

Sólo cambia su patrón incluyen la adición de un remolque/al final del patrón incluyen y que va a trabajar:

rsync -avz --delete --include=specs/install/project1/ \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

O, como alternativa, preparar un archivo de filtro de la siguiente manera:

$ cat <<EOF>pattern.txt 
> + specs/install/project1/ 
> - specs/* 
> EOF 

a continuación, utilice la opción --filter:

rsync -avz --delete --filter=". pattern.txt" \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

para más información vaya a la sección de reglas de filtrado en el Página de manual de rsync (1).

+2

Las reglas de filtro son de hecho la única manera sensata de lidiar con algo más complicado que "excluir todos los directorios .git". –

8

La otra solución no funciona aquí.


manera fiable

Usted no tiene más remedio que bajar manualmente para cada nivel de su sub-directorio. No hay riesgo de incluir archivos no deseados, ya que rsync no incluye los archivos de los directorios incluidos.

1) Crear un archivo de inclusión filtro, por ejemplo "include_filter.txt":

+ /specs/ 
+ /specs/install/ 
+ /specs/install/project1/*** 
- /specs/** 

2) Ejecutar:

rsync -avz --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 
  • No olvide la barra de inicio "/ ", de lo contrario, puede coincidir con los subdirectorios llamados" **/specs/install/project1/".
  • Al elegir un filtro de tipo de inclusión (--include-from = FILE), los signos de inicio más "+" son en realidad opcionales, ya que esta es la acción predeterminada sin signo. (Puede tener el opuesto "-" por defecto con --exclude-from = FILE.)
  • Las estrellas dobles "**" significa "cualquier camino"
  • Los triples estrellas "***" significa "cualquier ruta, incluyendo este mismo directorio"

manera fácil

Puede iniciar sus filtros "* /", permitiendo que rsync descienda todos sus subniveles. Esto es conveniente pero:

  • Se incluirán todos los directorios, aunque estén vacíos. Esto se puede arreglar con la opción rysnc -m, pero luego se omitirán todos los directorios vacíos.

1) Crear un archivo de filtro de inclusión, por ejemplo "include_filter.txt":

+ /**/ 
+ /specs/install/project1/*** 
- /specs/** 

2) ejecutarlo:

rsync -avzm --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

cuenta que la opción -m añadido.

Cuestiones relacionadas