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/ b
vytvoříb/foo
za každýa/foo
). Jinak se zkopíruje samotný adresář (rsync -r a b
vytvoří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/