Az rsync kizárja azt a könyvtárat, amely nem működik

Fedora 17 64 bites verziót futtatok, és a rsync --exclude=/home/ben/<dir> nem a várt módon működik .

Megpróbálom rsync a saját könyvtáramat hüvelykujj-meghajtóvá tenni, de mindenképpen ki akarom zárni azokat a könyvtárakat, amelyek tárolják a gyorsítótárat és fájlokat készítenek. Ezt a parancsot használom:

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

Azonban a ~/build és ~/.ccache fájlt a rsync másolja. Mit csinálok rosszul?

Megjegyzések

  • szerintem a minták kizárása csak <

nem működik.

Válasz

iv class = ” A “<

globális / szűrőszabályok lehorgonyozódnak a átvitel. Idézés a man oldal “MEGFELELÉSE / KIVÉTELÉRE MINTASZABÁLYAI” szakaszából:

ha a minta a / -vel kezdődik, akkor egy egy adott hely a fájlok hierarchiájában, különben az elérési út végéhez illeszkedik. Ez hasonló a szabályos kifejezésekben a vezető ^ -hez. Így a “/ foo” egyezik a “foo” névvel akár a ” átvitel “(globális szabály esetén) vagy az egyesítési fájl” könyvtárában (a könyvtáranként szabály).

A parancsban (rsync ... -arv /home/ben home-ben/) a /home/ben/foo átkerül a home-ben/ben/foo fájlba. Az átvitel gyökere home-ben, a helyes szűrési út pedig /ben/foo. Így

  • a /home/ben/.ccache megfeleléshez /ben/.ccache
  • a /home/ben/build/ megfeleltetéséhez /ben/build/

szűrőútvonalra van szükség a rsync(1) kézikönyv “RÖGZÍTÉSI BEKÖTÉS / KIVÉTEL MINTÁK” részében található.


Ne feledje, hogy a vezető / elhagyása nem feltétlenül az, amit akar. Ismét idézet ugyanazon man oldalrészből:

A minősítés nélküli “foo” egyezik a “foo” névvel a fa bármely pontján, mert az algoritmust alkalmazzák rekurzív módon fentről lefelé; úgy viselkedik, mintha az egyes útvonal-összetevők fordulatot kapnának a fájlnév végén. Még a nem hitelesített “sub / foo” is egyezik a hierarchia bármely pontján, ahol egy “foo” megtalálható egy “sub” nevű könyvtárban. Tekintse meg a RÖGZÍTÉS MEGFELELÉSE / KIZÁRÁSA MINTÁK című részt, hogy átfogóan megvitassa, hogyan adható meg az átvitel gyökerében egyező minta.

Így a (z) build/ szűrőminta megegyezne egy build könyvtárral bárhol a , még /home/ben/many/sub/directories/build/.

Megjegyzések

  • A legfontosabb részlet, hogy a perjelek számítanak . Ha perjelet fűz a forráskönyvtár végéhez (rsync -a forrás / cél), akkor az átmásolja a forrás tartalmát, ellenkező esetben rsync -a source destination magát a forráskönyvtárat másolja a rendeltetési helyre. Ez határozza meg, hogy mi lesz az átvitel gyökere a kizáró kifejezés tájékoztatása érdekében. Ezután a kizáró kifejezés megfelelő használatát a fentiekben ismertetjük. Különösképpen vegye figyelembe, hogy a rsync --exclude='/dir1' source destination nem fog kizárni ' semmit.

Válasz

FIGYELEM: Per @ rubo77 “alábbi megjegyzés , ezt a választ csak akkor szabad használni, ha hajlandó kizárni ezeket az elemeket a forrásfáján mindenhol, nem csak a gyökérnél. Alaposabb magyarázatért lásd a @ jw013 fenti válaszát.

Úgy gondolom, hogy a exclude útvonalaknak viszonyítaniuk kell a forrás útvonalához. ezt inkább megpróbálja?

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

Itt van egy teszt, összehasonlításképpen:

/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 

Megjegyzések

  • Ez a válasz téves. Ha relatív kizárási útvonalat használ, akkor a mintát mindenhol kizárná!
  • Ez a bejegyzés helyes. Az illesztés szöveges, nem fájl inode alapú. Bármelyik utat is mutatja a --verbose parancs kimenete, az a formátum, amelyet használnia kell.
  • Ez nekem bevált.
  • Mi lenne, ha a a forrás elérési útja ' / ', akkor abszolút érték a relatív útvonal, de még mindig nem ' t működnek.
  • Ez az egyetlen dolog, ami bevált.

Válasz

A kizárási mintád működne, ha az egész / home elérési utat szinkronizálod, azazzáró perjel nélkül:

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

De jobb, ha a mappa tartalmát csak egy záró perjel szinkronizálja:

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

Használhat egy figyelmen kívül hagyási listát is, lásd: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Válasz

Ez a probléma egy szkriptben volt (nem tudom, hogy ez a te eseted). Azért voltam, mert ezt a parancsot egy szkriptben használtam, és az sh-t használtam a bash helyett. ellenőrizze a szkript elején található shebangot.

Megjegyzések

  • Hogyan okozná ezt a problémát a shellértelmező shell-választása?

Válasz

Annak érdekében, hogy egy adott mappát kizárhasson az rsync használatával, figyelembe kell vennie a relatív elérési utat a parancsban. ebben az esetben:

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

ahol a “ben” a szinkronizálandó mappa

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük