Snažím se vytvořit adresář, který bude obsahovat všechny a pouze moje PDF zkompilované z LaTeXu. Líbí se mi mít každý projekt v samostatné složce, všechny uložené ve velké složce s názvem LaTeX . Tak jsem zkusil spustit:
rsync -avn *.pdf ~/LaTeX/ ~/Output/
který by měl najít všechny soubory pdf v ~/LaTeX/ a přeneste je do výstupní složky. Toto nefunguje. Píše mi to, že nebyly nalezeny žádné shody pro „*.pdf “. Pokud tento filtr vynechám, příkaz vypíše všechny soubory ve všech složkách projektu pod LaTeXem. Takže je to problém s filtrem *.pdf. Pokusil jsem se nahradit ~/ s úplnou cestou k mému domovskému adresáři, ale to nemělo vliv.
Jsem, používám zsh. Zkoušel jsem udělat to samé v bash a dokonce s filtr, který vypsal každý jednotlivý soubor v každém podadresáři... Co se tady děje?
Proč rsync nerozumí mému filtru pouze ve formátu PDF?
OK. Takže aktualizujte:Ne, snažím se
rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/
A to mi dává celý seznam souborů. Asi proto, že vše odpovídá prvnímu vzoru…
Přijatá odpověď:
TL,DR:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync zkopíruje zdroj (zdroje) do cíle. Pokud předáte *.pdf jako zdroje to shell rozšíří na seznam souborů s .pdf příponu v aktuálním adresáři. Nedochází k žádnému rekurzivnímu procházení, protože jste jako zdroj nepředali žádný adresář.
Takže musíte spustit rsync -a ~/LaTeX/ ~/Output/ , ale s filtrem, který řekne rsync, aby zkopíroval .pdf pouze soubory. Pravidla filtrování Rsync se mohou zdát skličující, když si přečtete příručku, ale pomocí několika jednoduchých pravidel můžete vytvořit mnoho příkladů.
-
Začlenění a vyloučení:
- Vyloučení souborů podle názvu nebo umístění je snadné:
--exclude=*~,--exclude=/some/relative/location(ve vztahu ke zdrojovému argumentu, např. toto vylučuje~/LaTeX/some/relative/location). - Pokud chcete porovnat pouze několik souborů nebo umístění, zahrňte je, zahrňte každý adresář, který k nim vede (například pomocí
--include=*/), poté vylučte zbytek pomocí--exclude='*'. Důvodem je: - Pokud vyloučíte adresář, vyloučí se tím vše pod ním. Vyloučené soubory nebudou vůbec brány v úvahu.
- Pokud zahrnete adresář, nezahrnuje to automaticky jeho obsah. V posledních verzích
--include='directory/***'udělá to. - Pro každý soubor platí první pravidlo shody (a zahrnuje vše, co se nikdy neshodovalo).
- Vyloučení souborů podle názvu nebo umístění je snadné:
-
Vzory:
- Pokud vzor neobsahuje
/, vztahuje se na název souboru sans adresář. - Pokud vzor končí
/, vztahuje se pouze na adresáře. - Pokud vzor začíná
/, vztahuje se na celou cestu z adresáře, která byla předána jako argument dorsync. *jakýkoli podřetězec jedné komponenty adresáře (tj. nikdy neodpovídá/);**odpovídá libovolnému podřetězci cesty.
- Pokud vzor neobsahuje
-
Pokud zdrojový argument končí znakem
/, jeho obsah se zkopíruje (rsync -r a/ bvytvoříb/fooza každýa/foo). Jinak se zkopíruje samotný adresář (rsync -r a bvytvoříb/a).
Proto zde musíme zahrnout *.pdf , zahrnout adresáře, které je obsahují, a vyloučit vše ostatní.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Všimněte si, že to zkopíruje všechny adresáře, dokonce i ty, které neobsahují žádný odpovídající soubor nebo podadresář, který by nějaký obsahoval. Tomu se lze vyhnout pomocí --prune-empty-dirs možnost (nejedná se o univerzální řešení, protože pak nemůžete zkopírovat adresář, ani když jej explicitně porovnáte, ale to je vzácný požadavek).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/