shell - usar - rsync excluye un directorio pero incluye un subdirectorio
rsync opciones (3)
El orden de --include
y --include
afecta lo que se está incluyendo o excluyendo.
Cuando hay subdirectorios particulares que deben incluirse, primero hay que colocarlos.
Publicación similar disponible here .
Estoy intentando copiar un proyecto a mi servidor con rsync. Tengo scripts de instalación específicos del proyecto en un subdirectorio
proyecto / especificaciones / instalar / proyecto1
Lo que estoy tratando de hacer es excluir todo en el directorio proyecto / especificaciones , pero el directorio de instalación específico del proyecto: proyecto / especificaciones / instalación / proyecto1 .
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.
Lo he intentado todo, pero parece que no consigo que esto funcione
En algún momento es solo un detalle.
Simplemente cambie su patrón de inclusión agregando un final / al final del patrón de inclusión y funcionará:
rsync -avz --delete --include=specs/install/project1/ /
--exclude=specs/* /srv/http/projects/project/ /
[email protected]:~/projects/project
O, como alternativa, prepare un archivo de filtro como este:
$ cat << EOF >pattern.txt
> + specs/install/project1/
> - specs/*
> EOF
Luego usa la opción --filter:
rsync -avz --delete --filter=". pattern.txt" /
/srv/http/projects/project/ /
[email protected]:~/projects/project
Para obtener más información, vaya a la sección REGLAS DE FILTROS en la página de manual de rsync (1).
La otra solución no funciona aquí.
Forma confiable
No tiene más remedio que descender manualmente para cada nivel de su subdirectorio. No hay riesgo de incluir archivos no deseados, ya que rsync no incluye los archivos de los directorios incluidos.
1) Cree un archivo de filtro de inclusión, por ejemplo "include_filter.txt":
+ /specs/
+ /specs/install/
+ /specs/install/project1/***
- /specs/**
2) Ejecutarlo:
rsync -avz --delete --include-from=include_filter.txt /
/srv/http/projects/project/ /
[email protected]:~/projects/project
- No olvide la barra inicial "/", de lo contrario, puede hacer coincidir los subdirectorios llamados "** / specs / install / project1 /".
- Al elegir un filtro de tipo de inclusión (--include-from = FILE), los signos de inicio + "+" son en realidad opcionales, ya que esta es la acción predeterminada sin signo. (Puede tener el opuesto "-" de forma predeterminada con --exclude-from = FILE.)
- Las estrellas dobles "**" significa "cualquier camino"
- Las estrellas triples "***" significa "cualquier ruta, incluido este mismo directorio"
Forma 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 puede solucionarse con la opción rysnc -m, pero luego se omitirán todas las direcciones vacías.
1) Cree 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
Tenga en cuenta la opción añadida -m.