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='*/'
?