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.