venv/
debe excluirse antes de */
incluirlo:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
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 directorio venv/
está incluido por --include='*/'
y la regla de exclusión nunca es consultada.
¿Podríamos simplificar esto?
¿Por qué necesitamos --include='*/'
y --exclude='*'
? ¿Por qué no es --exclude=venv/ --include='*.py'
suficiente?
El valor predeterminado es incluir archivos / directorios. Entonces, considere:
rsync -avz --exclude='venv/' --include='*.py' source target
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 porque rsync
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.
--include='*/'
?