Quiero sincronizar solo ciertos tipos de archivos (por ejemplo .py
) y quiero excluir archivos en algunos directorios (por ejemplo venv
).
Esto es lo que he intentado:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Pero no funciona.
¿Qué me estoy perdiendo?
También seguí la respuesta a esta pregunta pero no ayudó.
--include='*/'
?Respuestas:
venv/
debe excluirse antes de*/
incluirlo:La sutileza es que
rsync
procesa las reglas en orden y gana la primera regla coincidente. Entonces, si--include='*/'
es antes--exclude='venv/'
, entonces el directoriovenv/
está incluido por--include='*/'
y la regla de exclusión nunca es consultada.¿Podríamos simplificar esto?
El valor predeterminado es incluir archivos / directorios. Entonces, considere:
Esto incluiría todo excepto archivos o directorios debajo
venv/
. Sin embargo, solo quieres.py
archivos. Eso significa que tenemos que excluir explícitamente otros archivos con--exclude='*'
.--exclude='*'
excluye tanto archivos como directorios. Entonces, si especificamos--exclude='*'
, todos los directorios se excluirían y solo se encontrarían los.py
archivos en el directorio raíz..py
los archivos en subdirectorios nunca se encontrarían porquersync
no busca en directorios que están excluidos. Por lo tanto, si lo hemos hecho--exclude='*'
, debemos precederlo--include='*/'
para garantizar que se exploren los contenidos de todos los directorios.fuente
--include='*/'
y--exclude='*'
? ¿Por qué solo--exclude=venv/ --include='*.py'
no funciona?