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, žersync --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