mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d
Questo funziona. Come test/a è la directory di base sincronizzata, il modello di esclusione viene specificato iniziando con a/
Mostraci i veri percorsi/esclusioni se questo non aiuta.
L'esecuzione di rsync con -vn elencherà directory/file:il modello viene confrontato con il formato stampato da rsync.
Uno di questi funzionerebbe:
rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Nota la desinenza / nel percorso di origine fa una differenza fondamentale rispetto a come --exclude dovrebbe essere specificato. Ciò presuppone che abbiamo:
mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest
Il post originale ha difficoltà quando il percorso di esclusione inizia con un / . La risposta di Daniel è corretta che questo / iniziale in exclude path potrebbe essere desiderabile escludere un percorso specifico e che questo / iniziale dovrebbe essere inteso come ^ iniziale nelle espressioni regolari. Tuttavia, la sua risposta contiene un errore di battitura sulla desinenza / nel percorso di origine.
Seguendo l'esempio di Erik, vuoi fare questo:
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
In realtà, né la risposta di Erik né quella di Antoni sono del tutto accurate.
Erik ha ragione nel dirlo
Poiché test/a è la directory di base sincronizzata, il modello di esclusione viene specificato iniziando con a/
È vero che la radice del modello di esclusione è test/a (ovvero il pattern /some/path si lega a test/a/some/path ), ma non è tutto.
Dalla 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 percorso. Questo è simile a un ^ iniziale nelle espressioni regolari. Quindi "/foo" corrisponderebbe a un file chiamato "foo" nella "radice del trasferimento" (per una regola globale) o nella directory del file di unione (per una regola per directory).
Possiamo ignorare il per-directory un po' perché qui non si applica a noi.
Pertanto, rsync -nvraL test/a test/dest --exclude=a/b/c/d escluderà sicuramente test/a/b/c/d (e figli), ma escluderà anche test/a/other/place/a/b/c/d .
rsync -nvraL test/a test/dest --exclude=/b/c/d , invece, escluderà solo test/a/b/c/d (e figli) (test/a essendo il punto in cui / è ancorato).
Questo è il motivo per cui hai ancora bisogno della barra iniziale di ancoraggio se vuoi escludere quel percorso specifico dal backup. Questo potrebbe sembrare un dettaglio minore, e lo sarà tanto più specifico diventa il tuo modello di esclusione (ad es. Pictures contro home/daniel/Pictures ) ma potrebbe arrivare a morderti nel culo.