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