La directory di esclusione rsync non funziona

Sto eseguendo Fedora 17 a 64 bit e rsync --exclude=/home/ben/<dir> non funziona come previsto .

Sto cercando di rsync la mia directory home su una pen drive, ma voglio escludere certamente le directory che contengono file di cache e file di build. Questo è il comando che sto usando:

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

Tuttavia, i contenuti di ~/build e ~/.ccache è stato copiato da rsync. Che cosa sto facendo di sbagliato?

Commenti

  • Penso che i modelli di esclusione non funzionino '.

Risposta

Le regole di filtro rsync globali che iniziano con / iniziale sono ancorate alla radice di Citando dalla sezione “INCLUDI / ESCLUDI LE REGOLE DEL PATTERN” della pagina man:

se il pattern inizia con / allora è ancorato a un punto particolare nella gerarchia dei file, altrimenti viene confrontato con la fine del percorso. Questo è simile a un iniziale ^ nelle espressioni regolari. Pertanto “/ pippo” corrisponderebbe a un nome di “pippo” alla “radice del transfer “(per una regola globale) o nella directory del file di unione (per una regola per directory).

Nel tuo comando (rsync ... -arv /home/ben home-ben/), il file /home/ben/foo verrebbe trasferito a home-ben/ben/foo. La radice del trasferimento è home-ben e il percorso del filtro corretto è /ben/foo. Pertanto,

  • per trovare la corrispondenza con /home/ben/.ccache è necessario un percorso di filtro di /ben/.ccache
  • per trovare una corrispondenza con /home/ben/build/ è necessario un percorso di filtro /ben/build/

Una spiegazione più dettagliata può essere si trova nella sezione “ANCHORING INCLUDE / EXCLUDE PATTERNS” della rsync(1) pagina man .


Nota che tralasciare semplicemente il / iniziale non è necessariamente quello che vuoi. Citando ancora dalla stessa sezione della pagina man:

Un “pippo” non qualificato corrisponderebbe a un nome di “pippo” ovunque nellalbero perché lalgoritmo è applicato ricorsivamente dallalto verso il basso; si comporta come se ogni componente del percorso avesse una svolta alla fine del nome del file. Anche il “sub / foo” non ancorato corrisponderebbe in qualsiasi punto della gerarchia in cui è stato trovato un “foo” allinterno di una directory chiamata “sub”. Vedere la sezione ANCHORING INCLUDE / EXCLUDE PATTERNS per una discussione completa su come specificare un pattern che corrisponda alla radice del trasferimento.

Pertanto un pattern di filtro di build/ corrisponderebbe a una directory di build ovunque in /home/ben, anche /home/ben/many/sub/directories/build/.

Commenti

  • Il dettaglio chiave è che le barre contano . Se aggiungi una barra alla fine della directory di origine (rsync -a source / destination) copierà il contenuto di source, altrimenti rsync -a source destination copia la directory di origine stessa nella destinazione. Questo determina quale sarà la radice del trasferimento per informare lespressione di esclusione. Luso corretto di / nellespressione di esclusione è quindi spiegato sopra. Tieni presente in particolare che rsync --exclude='/dir1' source destination non ' esclude nulla.

Risposta

ATTENZIONE: Per @ rubo77 “commento di seguito , questa risposta dovrebbe essere usata solo se sei disposto a escludere questi elementi ovunque nel tuo albero dei sorgenti, non solo alla radice. Vedi la risposta di @ jw013 “sopra per una spiegazione più approfondita.

Penso che i tuoi exclude percorsi debbano essere relativi al percorso di origine. Può provi questo invece?

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

Ecco “un test, per confronto:

/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 

Commenti

  • Questa risposta è sbagliata. Con un percorso di esclusione relativo escluderesti il pattern ovunque!
  • Questo post è corretto. La corrispondenza è basata su testo, non su file inode. Qualunque sia il percorso mostrato dalloutput del comando --verbose è il formato che devi usare.
  • Questo ha funzionato per me.
  • E se il il percorso di origine è ' / ' gli assoluti sono i percorsi relativi, ma non ' t funziona.
  • Questa è lunica cosa che ha funzionato per me.

Rispondi

Il tuo pattern di esclusione funzionerebbe, se rsync lintero percorso / home essenza una barra finale:

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

Ma meglio sincronizzare solo il contenuto della cartella con una barra finale:

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

Puoi anche utilizzare un elenco da ignorare, vedi: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Risposta

Ho riscontrato questo problema in uno script (non so se è il tuo caso). Lo ero perché ho usato questo comando in uno script e stavo usando sh invece di bash. controlla lo shebang allinizio del tuo script.

Commenti

  • In che modo la scelta dellinterprete di shell potrebbe causare questo particolare problema?

Risposta

Per escludere una cartella specifica con rsync è necessario considerare il percorso relativo nel comando. nel tuo caso:

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

dove “ben” è la cartella che stai sincronizzando

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *