GNU/Linux >> Znalost Linux >  >> Linux

Nelze získat možnost vyloučení rsync pro vyloučení dir

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.


Linux
  1. Vyloučit všechny soubory podtržení teček z Rsync?

  2. Rsync:Jak přemístit absolutní symbolické odkazy?

  3. Rsync Exclude Folder nefunguje?

  1. 6 rsync Příklady k vyloučení více souborů a adresářů pomocí exclude-from

  2. Jak použít příkaz 'cp' k vyloučení konkrétního adresáře?

  3. rsync kopíruje pouze určité typy souborů pomocí volby include

  1. Nelze použít mkdir v domovském adresáři:oprávnění odepřeno (Linux Lubuntu)

  2. Nelze spustit php-fpm - nelze získat uid pro uživatele 'apache'

  3. Problémy s příkazy Rsync, oprávnění vlastníka a skupiny se nemění