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/.ccachetrenger 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 destinationselve 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 destinationvant ' 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