Rsync, включайте лише певні типи файлів, виключаючи деякі каталоги


14

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

Це те, що я спробував:

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

Але це не працює.

Що я пропускаю?

Я також слідкував за відповіддю на це питання, але це не допомогло.


навіщо вам потрібен початковий --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='*/'щоб забезпечити вивчення вмісту всіх каталогів.


Чудово! Дякую! Просто для мого розуміння, навіщо нам потрібні --include='*/'і --exclude='*'? Чому тільки --exclude=venv/ --include='*.py'не працює?
CentAu

1
@CentAu Я просто оновив відповідь обговоренням цього питання.
John1024

Як виконати команду, якщо у мене є рекурсивні каталоги, які я хочу надіслати лише одного типу файлів. Здається, це робиться лише для цільового каталогу, ймовірно, через останнє виключення, яке виключає все.
Чарлі Паркер

1
Закладка! Особливо для тонкощі. Я не можу придумати жодної іншої утиліти CLI, де порядок прапорів взагалі має значення!
antortjim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.