rsync vyloučit adresář nefunguje

Používám 64bitovou verzi Fedory 17 a rsync --exclude=/home/ben/<dir> nefunguje podle očekávání .

Snažím se rsync svůj domovský adresář na palec, ale chci určitě vyloučit adresáře, které obsahují soubory mezipaměti a vytvářejí soubory. Toto je příkaz, který používám:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/ 

Obsah ~/build a kopíruje rsync. Co dělám špatně?

Komentáře

  • Myslím, že vylučující vzory prostě nepracují. = „2bf1b86175″>

.

Odpovědět

Globální rsync pravidla filtrování začínající úvodním / jsou ukotvena do kořenového adresáře převod. Citace ze sekce „ZAHRNUTO / VYLOUČENO VZOROVÉ PRAVIDLA“ na manuálové stránce:

pokud vzor začíná a /, je ukotven k a konkrétní místo v hierarchii souborů, jinak je porovnáno s koncem cesty. Je to podobné jako úvodní ^ v regulárních výrazech. Proto by „/ foo“ odpovídalo názvu „foo“ buď v „kořenovém adresáři“ transfer „(pro globální pravidlo) nebo v adresáři sloučeného souboru (pro pravidlo pro každý adresář).

Ve vašem příkazu (rsync ... -arv /home/ben home-ben/) soubor /home/ben/foo bude převeden do home-ben/ben/foo. Kořen přenosu je home-ben a správná cesta k filtru je /ben/foo. Proto

  • k přizpůsobení /home/ben/.ccache potřebujete cestu filtru /ben/.ccache
  • pro shodu /home/ben/build/ potřebujete cestu filtru /ben/build/

Podrobnější vysvětlení může být nalezen v sekci „KOTVENÍ ZAHRNUTÍ / VYLOUČENÍ VZORŮ“ na rsync(1) příruční stránce .


Upozorňujeme, že pouhé vynechání úvodních / není nutně to, co chcete. Znovu cituji ze stejné sekce manuálové stránky:

Nekvalifikovaný výraz „foo“ by odpovídal názvu „foo“ kdekoli ve stromu, protože je použit algoritmus rekurzivně shora dolů; chová se, jako by se každá složka cesty dostala na konec názvu souboru. Dokonce i nezakotvený „sub / foo“ by se shodoval v kterémkoli bodě hierarchie, kde byl v adresáři s názvem „sub“ nalezen „foo“. Úplnou diskusi o tom, jak určit vzor, který odpovídá kořenu přenosu, najdete v části KOTVENÍ ZAHRNUTÍ / VYLOUČENÍ VZORŮ.

Takto by vzor filtru build/ odpovídal adresáři sestavení kdekoli v /home/ben, even /home/ben/many/sub/directories/build/.

Komentáře

  • Klíčovým detailem je, že lomítka jsou důležitá . Pokud na konec zdrojového adresáře připojíte lomítko (rsync -a source / destination), zkopíruje se obsah zdroje, jinak rsync -a source destination zkopíruje samotný zdrojový adresář do cíle. To určuje, jaký bude kořen přenosu, aby bylo možné informovat vyloučený výraz. Správné použití výrazu / ve vylučovacím výrazu je vysvětleno výše. Zejména si všimněte, že rsync --exclude='/dir1' source destination nebude ' nic vylučovat.

Odpovědět

UPOZORNĚNÍ: Komentář níže @ rubo77 , tato odpověď by měla být použita pouze v případě, že jste ochotni vyloučit tyto položky všude ve zdrojovém stromu, nejen v kořenovém adresáři. Podrobnější vysvětlení naleznete v odpovědi @ jw013 výše.

Myslím, že vaše cesty exclude musí být relativní ke zdrojové cestě. Může místo toho to zkusíte?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/ 

Zde je test pro srovnání:

/tmp$ tree src dest src ├── a └── b dest └── foo/ /tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest sending incremental file list src/ src/a src/b $ rsync -nav --exclude b /tmp/src /tmp/dest sending incremental file list src/ src/a 

Komentáře

  • Tato odpověď je chybná. S relativní vylučovací cestou byste vzor vyloučili všude!
  • Tento příspěvek je správný. Přiřazení je založeno na textu, nikoli na souboru inode. Bez ohledu na cestu, kterou výstup příkazu --verbose zobrazuje, je formát, který musíte použít.
  • Toto fungovalo pro mě.
  • Co když zdrojová cesta je ' / ' absolutní relativní cesty, ale stále to ' t práce.
  • Toto je jediná věc, která pro mě fungovala.

Odpověď

Váš vylučovací vzor by fungoval, pokud rsync celou cestu / home tjbez koncového lomítka:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/ 

Lepší je však pouze rsync obsahu složky s koncovým lomítkem:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/ 

Můžete také použít seznam ignorovaných položek, viz: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Odpověď

Tento problém jsem měl ve skriptu (nevím, jestli je to váš případ). Byl jsem proto, že jsem použil tento příkaz ve skriptu a místo bash jsem použil sh. zkontrolujte shebang na začátku vašeho skriptu.

Komentáře

  • Jak by tento konkrétní problém způsobil výběr shellu interpreta prostředí?

Odpověď

Chcete-li vyloučit konkrétní složku s rsync, musíte zvážit relativní cestu v příkazu. ve vašem případě:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/ 

kde „ben“ je složka, kterou synchronizujete

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *