GNU/Linux >> Znalost Linux >  >> Linux

Filtr Rsync:Kopírování pouze jednoho vzoru?

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).
  • 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 do rsync .
    • * jakýkoli podřetězec jedné komponenty adresáře (tj. nikdy neodpovídá / ); ** odpovídá libovolnému podřetězci cesty.
  • 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 ).

Související:Kdy byste použili další deskriptor souboru?

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/

Linux
  1. Sed:Vytisknout pouze první výskyt shody vzoru?

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

  3. Rsync dva typy souborů v jednom příkazu?

  1. cp:vynechání adresáře – chyba při kopírování adresáře v Linuxu

  2. Přes filtr veďte pouze STDERR

  3. Pomocí možností Rsync zahrnout a vyloučit zahrnout adresář a soubor podle vzoru

  1. Lomítka a příkaz rsync

  2. Rsync kopíruje aktuální adresář s názvem

  3. Nastavení DRBD pouze s jedním uzlem