GNU/Linux >> Znalost Linux >  >> Linux

Rsync, zahrnuje pouze určité typy souborů s výjimkou některých adresářů?

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


Linux
  1. Protokolovat pouze přenesené soubory pomocí Rsync?

  2. Příkaz Shell do adresáře tar s výjimkou určitých souborů/složek

  3. Odstraňte pouze soubory v adresáři v adresářích linux NOT

  1. Jak tarovat (komprimovat) soubory, s výjimkou určitých souborů nebo adresářů

  2. Porovnat adresáře, ale ne obsah souborů?

  3. Rekurzivní statistiky o typech souborů v adresáři?

  1. Jak rekurzivně kopírovat adresáře pomocí rsync při vyloučení konkrétních souborů

  2. rsync kopíruje pouze určité typy souborů pomocí volby include

  3. tar/gzip s výjimkou určitých souborů