Rsync, включает только определенные типы файлов, исключая некоторые каталоги

14

Я хочу rsync только определенные типы файлов (например .py), и я хочу исключить файлы в некоторых каталогах (например venv).

Вот что я попробовал:

rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

Но это не работает.

Что мне не хватает?

Я также последовал за ответом на этот вопрос, но это не помогло.

CentAu
источник
зачем вам начальное --include='*/'?
Чарли Паркер
1
Как создать команду, если у меня есть рекурсивные каталоги, которые я хочу отправить только один тип файла. Кажется, он делает это только для целевого каталога, вероятно, из-за последнего исключения, которое исключает все
Чарли Паркер

Ответы:

17

venv/Необходимо исключить до того, как */ будет включено:

rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

Тонкость в том, что rsyncправила обрабатываются по порядку, и первое соответствующее правило выигрывает. Таким образом, если --include='*/'это раньше --exclude='venv/', то каталог venv/включается --include='*/'и правило исключения никогда не используется.

Можем ли мы упростить это?

А зачем нам --include='*/'и --exclude='*'? Почему не --exclude=venv/ --include='*.py'достаточно?

По умолчанию включены файлы / каталоги. Итак, рассмотрим:

rsync -avz --exclude='venv/' --include='*.py' source target

Это будет включать все, кроме файлов или каталогов в venv/. Вы, однако, хотите только .pyфайлы. Это означает, что мы должны явно исключить другие файлы с --exclude='*'.

--exclude='*'исключает как файлы, так и каталоги. Таким образом, если мы укажем --exclude='*', то все каталоги будут исключены, и .pyбудут найдены только файлы в корневом каталоге. .pyфайлы в подкаталогах никогда не будут найдены, поскольку rsyncне ищет исключенные каталоги. Таким образом, если у нас есть --exclude='*', мы должны предшествовать этому, --include='*/'чтобы гарантировать, что содержание всех каталогов исследовано.

John1024
источник
Большой! Спасибо! Просто для моего понимания, зачем нам --include='*/'и --exclude='*'? Почему только --exclude=venv/ --include='*.py'не работает?
CentAu
1
@CentAu Я только что обновил ответ с обсуждением этого.
John1024
Как создать команду, если у меня есть рекурсивные каталоги, которые я хочу отправить только один тип файла. Кажется, он делает это только для целевого каталога, вероятно, из-за последнего исключения, которое исключает все.
Чарли Паркер
1
Закладки! Особенно за тонкость. Я не могу думать ни о какой другой утилите CLI, где порядок флагов имеет значение вообще!
Антортжим