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 arsync --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