Jeg kjører Fedora 17 64-bit og rsync --exclude=/home/ben/<dir>
fungerer ikke som forventet .
Jeg prøver å rsync
hjemmekatalogen min til en tommelstasjon, men jeg vil absolutt ekskludere kataloger som inneholder cache-filer og bygger filer. Dette er kommandoen jeg bruker:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/
Innhold fra ~/build
og ~/.ccache
kopieres av rsync
. Hva gjør jeg galt?
Kommentarer
- Jeg tror ekskluder mønstre bare ' t fungerer.
Svar
Globale rsync
filterregler som begynner med en ledende /
er forankret til roten til Overføring. Sitering fra delen «INKLUDER / UTELUK MØNSTERREGLER» på mansiden:
hvis mønsteret starter med a / så er det forankret til et bestemt sted i hierarkiet av filer, ellers blir det matchet mot slutten av banenavnet. Dette ligner på et ledende ^ i regulære uttrykk. Dermed vil «/ foo» matche navnet «foo» på enten «roten til overføre «(for en global regel) eller i flettefilens katalog (for en regel per katalog).
I kommandoen din (rsync ... -arv /home/ben home-ben/
), filen /home/ben/foo
vil bli overført til home-ben/ben/foo
. Roten til overføringen er home-ben
og riktig filterbane er /ben/foo
. Dermed
- for å matche
/home/ben/.ccache
trenger du en filterbane på/ben/.ccache
- for å matche
/home/ben/build/
trenger du en filterbane på/ben/build/
En mer detaljert forklaring kan være funnet i delen «ANCHORING INCLUDE / EXCLUDE Mønstre» i rsync(1)
man-siden .
Merk at å bare utelate den ledende /
ikke nødvendigvis er det du vil ha. Sitat igjen fra samme mansideseksjon:
En ukvalifisert «foo» vil matche navnet «foo» hvor som helst i treet fordi algoritmen blir brukt rekursivt fra toppen og ned; det oppfører seg som om hver banekomponent får en sving ved å være slutten på filnavnet. Selv den ikke-forankrede «sub / foo» vil matche når som helst i hierarkiet der en «foo» ble funnet i en katalog som heter «sub». Se delen om forankring inkluderer / utelukker mønstre for en fullstendig diskusjon om hvordan du spesifiserer et mønster som samsvarer med roten til overføringen.
Dermed vil et filtermønster på build/
matche en byggekatalog hvor som helst i /home/ben
, til og med /home/ben/many/sub/directories/build/
.
Kommentarer
- Det viktigste er at skråstrekninger betyr noe . Hvis du legger til en skråstrek til slutten av kildekatalogen (rsync -a kilde / destinasjon), vil den kopiere innholdet i kilden, ellers kopierer
rsync -a source destination
selve kildekatalogen til destinasjonen. Dette bestemmer hva roten til overføringen vil være for å informere ekskluderingsuttrykket. Riktig bruk av / i ekskluderingsuttrykket blir deretter forklart ovenfor. Vær spesielt oppmerksom på atrsync --exclude='/dir1' source destination
vant ' t ekskluderer noe.
Svar
ADVARSEL: Per @ rubo77 «s kommentar nedenfor , dette svaret skal bare brukes hvis du er villig til å ekskludere disse elementene overalt i kildetreet ditt, ikke bare ved roten. Se @ jw013s svar ovenfor for en grundigere forklaring.
Jeg tror exclude
-stiene må være relativt til kildestien. Kan prøver du dette i stedet?
rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/
Her «er en test, til sammenligning:
/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
- Dette svaret er feil. Med en relativ ekskluderingssti vil du ekskludere mønsteret overalt!
- Dette innlegget er riktig. Matchingen er tekstbasert, ikke filinode-basert. Uansett hvilken vei utgangen fra
--verbose
-kommandoen viser, er formatet du må bruke. - Dette fungerte for meg.
- Hva om kildebane er ' / ' så absolutt er de relative banene, men det gjør det fortsatt ikke ' t fungerer.
- Dette er det eneste som fungerte for meg.
Svar
Ekskluderingsmønsteret ditt vil fungere hvis du synkroniserer hele / hjemveien, dvs.uten et skråstrek:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/
Men bedre bare synkroniser innholdet i mappen med et etterfølgende skråstrek:
rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/
Du kan også bruke en ignoreringsliste, se: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders
Svar
Jeg hadde dette problemet i et skript (jeg vet ikke om det er ditt tilfelle). Jeg var fordi jeg brukte denne kommandoen i et skript, og jeg brukte sh i stedet for bash. sjekk shebang i begynnelsen av skriptet.
Kommentarer
- Hvordan ville skallvalget til skalltolk forårsake dette problemet?
Svar
For å ekskludere en spesifikk mappe med rsync, må du vurdere den relative banen i kommandoen. i ditt tilfelle:
rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/
der «ben» er mappen du synkroniserer