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ářů.