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