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.