Chci synchronizovat pouze určité typy souborů (např. .py ) a chci vyloučit soubory v některých adresářích (např. venv ).
Zkoušel jsem toto:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Ale to nefunguje.
Co mi chybí?
Také jsem sledoval odpověď na tuto otázku, ale nepomohlo to.
Přijatá odpověď:
 venv/ je třeba vyloučit před */ je zahrnuto:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
 Jemnost je v tom, že rsync zpracuje pravidla v pořadí a vyhraje první odpovídající pravidlo. Pokud tedy --include='*/' je před --exclude='venv/' , pak adresář venv/ je součástí --include='*/' a pravidlo vyloučení není nikdy konzultováno.
Mohli bychom to zjednodušit?
Proč potřebujeme
--include='*/'a--exclude='*'? Proč není--exclude=venv/ --include='*.py'dostačující?
Výchozí nastavení je zahrnout soubory/adresáře. Takže zvažte:
rsync -avz --exclude='venv/' --include='*.py' source target
 To by zahrnovalo vše kromě souborů nebo adresářů pod venv/ . Vy však chcete pouze .py soubory. To znamená, že musíme explicitně vyloučit ostatní soubory pomocí --exclude='*' .
 --exclude='*' nezahrnuje obojí soubory a adresáře. Pokud tedy zadáme --exclude='*' , pak by byly vyloučeny všechny adresáře a pouze .py soubory by se našel kořenový adresář. .py soubory v podadresářích by nikdy nebyly nalezeny, protože rsync nehledá do adresářů, které jsou vyloučeny. Pokud tedy máme --exclude='*' , musíme mu předcházet --include='*/' abyste zajistili, že bude prozkoumán obsah všech adresářů.