rsync exkluderar katalogen som inte fungerar

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 att rsync --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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *