Jag kör Fedora 17 64-bitars och rsync --exclude=/home/ben/<dir>
fungerar inte som förväntat .
Jag försöker rsync
min hemkatalog till en tummenhet, men jag vill verkligen utesluta kataloger som innehåller cachefiler och bygger filer. Detta är kommandot jag använder:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/
Men innehåll från ~/build
och ~/.ccache
kopieras av rsync
. Vad gör jag fel?
Kommentarer
- Jag tror att utesluta mönster bara inte ' fungerar inte.
Svar
Globala rsync
filterregler som börjar med en ledande /
är förankrade till roten till överföring. Citat från avsnittet ”INKLUDERA / UTSLUTA MÖNSTERREGLER” på mansidan:
om mönstret börjar med a / är det förankrat i ett särskild plats i filhierarkin, annars matchas den mot slutet av sökvägen. Detta liknar en ledande ^ i reguljära uttryck. Således skulle ”/ foo” matcha namnet på ”foo” vid antingen ”roten till överföra ”(för en global regel) eller i sammanfogningsfilens katalog (för en regel per katalog).
I ditt kommando (rsync ... -arv /home/ben home-ben/
), filen /home/ben/foo
skulle överföras till home-ben/ben/foo
. Roten för överföringen är home-ben
och rätt filterväg är /ben/foo
. Således
- för att matcha
/home/ben/.ccache
behöver du en filterväg till/ben/.ccache
- för att matcha
/home/ben/build/
behöver du en filterväg/ben/build/
En mer detaljerad förklaring kan ges finns i avsnittet ”FÖRKRÄKNING INKLUDERAR / EXKLUDERAR MÖNSTER” i rsync(1)
mansidan .
Observera att det inte nödvändigtvis är vad du vill ha om du bara lämnar det ledande /
. Citera igen från samma mansida avsnitt:
En okvalificerad ”foo” skulle matcha namnet ”foo” var som helst i trädet eftersom algoritmen tillämpas rekursivt uppifrån och ner; det beter sig som om varje bankomponent får en sväng när det är slutet på filnamnet. Även den oankrade ”sub / foo” skulle matcha när som helst i hierarkin där en ”foo” hittades i en katalog som heter ”sub”. Se avsnittet om FÖRKRÄKNING INKLUDERAR / EXKLUDERAR MÖNSTER för en fullständig diskussion om hur man anger ett mönster som matchar roten till överföringen.
Således skulle ett filtermönster av build/
matcha en byggkatalog var som helst i /home/ben
, även /home/ben/many/sub/directories/build/
.
Kommentarer
- Det viktigaste är att snedstreck betyder . Om du lägger till en snedstreck i slutet av källkatalogen (rsync -a källa / destination) kommer den att kopiera innehållet i källan, annars
rsync -a source destination
kopierar själva källkatalogen till destinationen. Detta bestämmer roten till överföringen för att informera uteslutningsuttrycket. Den korrekta användningen av / i uteslutningsuttrycket förklaras sedan ovan. Observera särskilt attrsync --exclude='/dir1' source destination
vann ' t utesluter någonting.
Svar
VARNING: Per @ rubo77 ”s kommentar nedan , detta svar bör endast användas om du är villig att utesluta dessa objekt överallt i ditt källträd, inte bara vid roten. Se @ jw013s svar ovan för en mer ingående förklaring.
Jag tror att dina exclude
-vägar måste vara relativt källvägen. Kan försöker du detta istället?
rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/
Här ”är ett test, för jämförelse:
/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
Kommentarer
- Det här svaret är fel. Med en relativ uteslutningsväg skulle du utesluta mönstret överallt!
- Det här inlägget är korrekt. Matchningen är textbaserad, inte filinodebaserad. Oavsett vilken väg som kommandot
--verbose
visar är det format du måste använda. - Detta fungerade för mig.
- Vad händer om källvägen är ' / ' då är absoluta de relativa sökvägarna, men ändå ' t fungerar.
- Det här är det enda som fungerade för mig.
Svar
Ditt uteslutningsmönster skulle fungera om du synkroniserar hela / hemvägen, dvs.utan efterföljande snedstreck:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/
Men bättre rsynkronisera bara innehållet i mappen med en efterföljande snedstreck:
rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/
Du kan också använda en ignoreringslista, se: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders
Svar
Jag hade det här problemet i ett skript (jag vet inte om det är ditt fall). Jag berodde på att jag använde det här kommandot i ett skript och jag använde sh istället för bash. kolla shebang i början av ditt skript.
Kommentarer
- Hur skulle skalvalet av skaltolk orsaka just detta problem?
Svar
För att utesluta en specifik mapp med rsync måste du överväga den relativa sökvägen i kommandot. i ditt fall:
rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/
där ”ben” är den mapp du synkroniserar