rsync ekskluder katalogen som ikke fungerer

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å at rsync --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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *