Я хочу rsync только определенные типы файлов (например .py
), и я хочу исключить файлы в некоторых каталогах (например venv
).
Вот что я попробовал:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Но это не работает.
Что мне не хватает?
Я также последовал за ответом на этот вопрос, но это не помогло.
--include='*/'
?Ответы:
venv/
Необходимо исключить до того, как*/
будет включено:Тонкость в том, что
rsync
правила обрабатываются по порядку, и первое соответствующее правило выигрывает. Таким образом, если--include='*/'
это раньше--exclude='venv/'
, то каталогvenv/
включается--include='*/'
и правило исключения никогда не используется.Можем ли мы упростить это?
По умолчанию включены файлы / каталоги. Итак, рассмотрим:
Это будет включать все, кроме файлов или каталогов в
venv/
. Вы, однако, хотите только.py
файлы. Это означает, что мы должны явно исключить другие файлы с--exclude='*'
.--exclude='*'
исключает как файлы, так и каталоги. Таким образом, если мы укажем--exclude='*'
, то все каталоги будут исключены, и.py
будут найдены только файлы в корневом каталоге..py
файлы в подкаталогах никогда не будут найдены, посколькуrsync
не ищет исключенные каталоги. Таким образом, если у нас есть--exclude='*'
, мы должны предшествовать этому,--include='*/'
чтобы гарантировать, что содержание всех каталогов исследовано.источник
--include='*/'
и--exclude='*'
? Почему только--exclude=venv/ --include='*.py'
не работает?