rsync esclude la directory non funziona


34

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

Sto cercando di accedere alla rsyncmia home directory su una chiavetta USB, ma voglio escludere sicuramente le directory che contengono file cache e creano file. Questo è il comando che sto usando:

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

Tuttavia, il contenuto di ~/builde ~/.ccacheviene copiato da rsync. Che cosa sto facendo di sbagliato?


1
Penso che i modelli di esclusione non funzionino.
Sören,

Risposte:


37

Le rsyncregole di filtro globali che iniziano con un lead /sono ancorate alla radice del trasferimento. Citando dalla sezione "INCLUDE / EXCLUDE PATTERN RULES" della pagina man:

se il modello inizia con un / allora è ancorato a un punto particolare nella gerarchia dei file, altrimenti viene confrontato con la fine del nome percorso. Questo è simile a un ^ nelle espressioni regolari. Pertanto "/ foo" corrisponderebbe a un nome di "foo" nella "radice del trasferimento" (per una regola globale) o nella directory del file di merge (per una regola per directory).

Nel tuo comando ( rsync ... -arv /home/ben home-ben/), il file /home/ben/fooverrebbe trasferito a home-ben/ben/foo. La radice del trasferimento è home-bene il percorso del filtro corretto è /ben/foo. Così,

  • per abbinare /home/ben/.ccacheè necessario un percorso del filtro di/ben/.ccache
  • per abbinare /home/ben/build/è necessario un percorso del filtro di/ben/build/

Una spiegazione più dettagliata può essere trovata nella sezione "ANCHORING INCLUDE / EXCLUDE PATTERNS" della rsync(1)pagina man .


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

Un "pippo" non qualificato corrisponderebbe a un nome di "pippo" in qualsiasi punto dell'albero perché l'algoritmo viene applicato ricorsivamente dall'alto verso il basso; si comporta come se ogni componente del percorso avesse una svolta in quanto era la fine del nome file. Anche il "sub / foo" non ancorato corrisponderebbe in qualsiasi punto della gerarchia in cui è stato trovato un "foo" all'interno di una directory denominata "sub". Vedi la sezione ANCHORING INCLUDE / EXCLUDE PATTERNS per una discussione completa su come specificare un modello che corrisponde alla radice del trasferimento.

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


2
Il dettaglio chiave è che le barre contano. Se si aggiunge una barra alla fine della directory di origine (rsync -a sorgente / destinazione), il contenuto della fonte verrà copiato, altrimenti verrà copiata la rsync -a source destinationdirectory di origine stessa nella destinazione. Questo determina quale sarà la radice del trasferimento per informare l'espressione di esclusione. L'uso corretto di / nell'espressione exclude è quindi spiegato sopra. Nota in particolare che rsync --exclude='/dir1' source destinationnon escluderà nulla.
pgoetz,

11

Penso che i tuoi excludepercorsi debbano essere relativi al percorso sorgente. Puoi provare 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

2
Questa risposta è sbagliata Con un relativo percorso di esclusione escluderesti lo schema ovunque!
rubo77,

Questo post è corretto La corrispondenza è basata su testo, non su file inode. Qualunque sia il percorso che --verbosemostra l'output del comando è il formato che devi usare.
Sridhar Sarnobat,

Questo ha funzionato per me.
Zhenyu,

Che cosa succede se il percorso di origine è '/', quindi i percorsi relativi sono assoluti, ma non funziona ancora.
Sören

Questa è l'unica cosa che ha funzionato per me.
Jonathan,

2

Ho avuto questo problema in una sceneggiatura (non so se è il tuo caso). Ero perché ho usato questo comando in uno script e stavo usando sh invece di bash. controlla lo shebang all'inizio della tua sceneggiatura.


1

Il tuo modello di esclusione funzionerebbe, se risincronizzi l'intero percorso / home, cioè senza 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 usare un elenco di ignore, vedi: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.