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 chersync --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