mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d
Tohle funguje. Jako test/a je základní adresář, ze kterého je synchronizován, vzor vyloučení je zadán počínaje a/
Pokud to nepomůže, ukažte nám skutečné cesty/výjimky.
Spuštěním rsync s -vn se zobrazí seznam adresářů/souborů - vzor se shoduje s formátem, který rsync vytiskne.
Každá z těchto možností by fungovala:
rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Všimněte si koncovky / ve zdrojové cestě je zásadní rozdíl oproti --exclude by mělo být specifikováno. To předpokládá, že máme:
mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest
Původní příspěvek má potíže, když cesta vyloučení začíná / . Danielova odpověď je správná, že tato iniciála / v vyloučit cestu může být žádoucí vyloučit konkrétní cestu, a to počáteční / by měl být chápán jako úvodní ^ v regulárních výrazech. Jeho odpověď však obsahuje kritický překlep ohledně koncovky / ve zdrojové cestě.
Podle Erikova příkladu to chcete udělat:
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Ve skutečnosti ani Erikova ani Antoniho odpověď není úplně přesná.
Erik má napůl pravdu, když to říká
Vzhledem k tomu, že test/a je základní adresář, ze kterého se synchronizuje, je vzor vyloučení specifikován počínaje a/
Je pravda, že kořen vzoru vyloučení je test/a (tj. vzor /some/path se váže na test/a/some/path ), ale to není celý příběh.
Z manuálové stránky:
pokud vzor začíná /, je ukotven k určitému místu v hierarchii souborů, jinak je porovnán s koncem názvu cesty. To je podobné úvodnímu ^ v regulárních výrazech. "/foo" by tedy odpovídalo souboru s názvem "foo" buď v "kořenovém adresáři přenosu" (pro globální pravidlo) nebo v adresáři slučovacího souboru (pro pravidlo pro jednotlivé adresáře).
per-directory můžeme ignorovat trochu, protože se nás zde netýká.
Proto rsync -nvraL test/a test/dest --exclude=a/b/c/d zcela určitě vyloučí test/a/b/c/d (a děti), ale vyloučí také test/a/other/place/a/b/c/d .
rsync -nvraL test/a test/dest --exclude=/b/c/d , na druhou stranu vyloučí pouze test/a/b/c/d (a děti) (test/a což je bod, do kterého / je ukotven).
To je důvod, proč stále potřebujete ukotvovací počáteční lomítko, pokud chcete vyloučit tuto konkrétní cestu od zálohování. Může se to zdát jako nepodstatný detail a bude tomu tak, čím konkrétnější bude váš vzor vyloučení (např. Pictures vs. home/daniel/Pictures ), ale může se stát, že vás kousne do zadku.