venv/debe excluirse antes de */ incluirlo:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
La sutileza es que rsyncprocesa 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 .pyarchivos. 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 .pyarchivos en el directorio raíz. .pylos archivos en subdirectorios nunca se encontrarían porque rsyncno 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='*/'?