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 probado:
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ó.
Respuesta aceptada:
venv/
debe ser excluido antes */
se incluye:
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='*/'
está antes de --exclude='venv/'
, luego el directorio venv/
está incluido por --include='*/'
y la regla de exclusión nunca se consulta.
¿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 bajo venv/
. Sin embargo, solo quieres .py
archivos Eso significa que tenemos que excluir explícitamente otros archivos con --exclude='*'
.
--exclude='*'
excluye ambos archivos y directorios. Entonces, si especificamos --exclude='*'
, entonces se excluirían todos los directorios y solo el .py
archivos si se encontraría el directorio raíz. .py
los archivos en los subdirectorios nunca se encontrarían porque rsync
no busca en los directorios que están excluidos. Por lo tanto, si tenemos --exclude='*'
, debemos precederlo con --include='*/'
para asegurarse de que se exploran los contenidos de todos los directorios.