rsync poissulkee hakemiston, joka ei toimi

Käytän 64-bittistä Fedora 17: tä ja rsync --exclude=/home/ben/<dir> ei toimi odotetulla tavalla .

Yritän rsync kotihakemistoa peukaloasemalle, mutta haluan sulkea pois varmasti hakemistot, jotka sisältävät välimuistitiedostoja ja rakentavat tiedostoja. Tätä komentoa käytän:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/ 

~/build ja iv id = rsync kopioi ”7982ac83ae”>

. Mitä teen väärin?

Kommentit

  • Luulen, että mallien poissulkeminen ei vain toimi '.

Vastaa

Globaalit rsync suodatinsäännöt, jotka alkavat /, ankkuroidaan juuriin lainaus man -sivun ”SISÄLTÄ / POISTA MALLISÄÄNNÖT” -osiosta:

jos kuvio alkaa a: lla, se on ankkuroitu tietyn paikan tiedostojen hierarkiassa, muuten se sovitetaan polun nimen päähän. Tämä on samanlainen kuin säännöllisten lausekkeiden johtava ^. Siten ”/ foo” vastaisi ”foo” -nimeä joko ”juuressa” siirto ”(yleinen sääntö) tai yhdistämistiedoston hakemistossa (for hakemistokohtainen sääntö).

Komennossa (rsync ... -arv /home/ben home-ben/) tiedosto /home/ben/foo siirretään tiedostoon home-ben/ben/foo. Siirron juuret ovat home-ben ja oikea suodatinpolku on /ben/foo. Siksi

  • /home/ben/.ccache vastaamiseksi tarvitset suodatinpolun /ben/.ccache
  • vastaamaan /home/ben/build/ tarvitset suodatinpolun /ben/build/

Tarkempi selitys voi olla löytyi rsync(1) -sivun ”ANKURITTAVAT SISÄLTÄ / POISTA MALLIT” -osiosta.


Huomaa, että etunimen / jättäminen pois ei välttämättä ole sitä, mitä haluat. Lainaus uudestaan samalta man-sivun osiosta:

Pätemätön ”foo” vastaisi ”foo” -nimeä missä tahansa puun osassa, koska algoritmia käytetään rekursiivisesti ylhäältä alaspäin; se käyttäytyy ikään kuin kukin polkukomponentti saa käännöksen, kun se on tiedostonimen loppu. Jopa ankkuroimaton ”sub / foo” sopisi mihin tahansa hierarkian kohtaan, jossa ”foo” löydettiin hakemistosta ”sub”. Katso ANKURIIN SISÄLTÄVÄT / POISTA-MALLIT-osiosta kattava keskustelu siitä, kuinka määritetään siirron juuressa sopiva malli.

Täten build/ -suodatinkuvio vastaa rakennushakemistoa missä tahansa kohdassa /home/ben, jopa /home/ben/many/sub/directories/build/.

Kommentit

  • Tärkeintä on, että kauttaviivat ovat tärkeitä . Jos liität kauttaviivan lähdekoodihakemiston loppuun (rsync -a lähde / kohde), se kopioi lähteen sisällön, muuten rsync -a source destination kopioi itse lähdehakemiston määränpäähän. Tämä määrittää siirron juuren poissulkevan lausekkeen informoimiseksi. Sitten poissuljetun lausekkeen oikea käyttö selitetään edellä. Huomaa erityisesti, että rsync --exclude='/dir1' source destination ei poissuljettu mitään '.

Vastaa

VAROITUS: Per @ rubo77 ”kommentti alla , tätä vastausta tulisi käyttää vain, jos olet valmis sulkemaan nämä kohteet pois lähdepuusta kaikkialla, ei vain juuressa. Katso @ jw013: n vastauksesta yllä perusteellisempi selitys.

Luulen, että exclude -polkuidesi on oltava suhteessa lähdepolkuun. kokeiletko tätä?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/ 

Tässä ”testi” vertailua varten:

/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 

Kommentit

  • Tämä vastaus on väärä. Suhteellisen poissulkemispolun kanssa suljettaisiin malli pois kaikkialta!
  • Tämä viesti on oikea. Vastaavuus on tekstipohjainen, ei tiedosto-inode-pohjainen. Minkä polun --verbose -komennon lähtö näyttää, on käytettävä muoto.
  • Tämä toimi minulle.
  • Entä jos lähdepolku on ' / ', silloin absoluuttiset ovat suhteelliset polut, mutta se ei silti ' ei toimi.
  • Tämä on ainoa asia, joka toimi minulle.

Vastaa

Poissulkemiskuvasi toimisi, jos synkronoit koko / kotipolunilman jälkiviivaa:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/ 

Mutta parempi uudelleensynkronoida vain kansion sisältö jälkiviivalla:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/ 

Voit käyttää myös ohitusluetteloa, katso: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

vastaus

Minulla oli tämä ongelma komentosarjassa (en tiedä, onko se sinun tapauksesi). Olin, koska käytin tätä komentoa komentosarjassa ja käytin sh: tä bashin sijaan. tarkista komentosarjan alussa oleva shebang.

Kommentit

  • Kuinka kuoren valinta tulkitulkista aiheuttaisi tämän ongelman?

Vastaa

Jotta poistat tietyn kansion rsync-toiminnolla, sinun on otettava huomioon komennon suhteellinen polku. tapauksessasi:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/ 

missä ”ben” on synkronoitava kansio

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *