2012-03-31 11 views
32

Ho problemi a ottenere la sintassi rsync corretta e mi chiedo se il mio scenario possa essere effettivamente gestito con rsync. Innanzitutto, ho confermato che rsync funziona perfettamente tra il mio host locale e il mio host remoto. Effettuare una sincronizzazione diretta su una directory ha esito positivo.Uso di Rsync include ed esclude opzioni per includere directory e file per modello

Ecco ciò che il mio file system appare come:

uploads/ 
    1260000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1270000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1280000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 

Quello che voglio fare è rsync eseguito solo su file che iniziano con "file_11_" nelle sottodirectory e voglio essere in grado di eseguire solo un lavoro rsync per sincronizzare tutti questi file nelle sottodirectory.

Ecco il comando che sto cercando:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

Ciò si traduce in 0 file che vengono selezionate per il trasferimento nel mio funzionamento a secco. Ho provato varie altre combinazioni di istruzioni --include e --exclude, ma o ha continuato a non ottenere risultati o ottenuto tutto come se non fossero state impostate opzioni di inclusione o esclusione.

Qualcuno ha qualche idea su come farlo?

risposta

67

Il problema è che --exclude="*" dice di escludere (ad esempio) la directory 1260000000/, così rsync mai esamina il contenuto di quella directory, in modo da non si accorge che la directory contiene i file che sarebbero stati abbinati dal vostro --include.

Penso che la cosa più vicina a quello che vuoi è questo:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(che includerà tutte le directory e tutti i file corrispondenti file_11*.jpg, ma nessun altro file), o forse questo:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(stesso concetto, ma molto più esigente sulle directory si include).

+1

Grazie! Era esattamente ciò di cui avevo bisogno. Il mio scenario era in realtà più o meno quello che hai descritto nel tuo secondo esempio, ma ho mantenuto la mia domanda semplificata per rendere la domanda più semplice. –

+0

@SheldonChang: Prego! – ruakh

+5

Nota l'importanza di (ad es. '--include =" */"' nell'inserimento delle directory ** parent ** dei file che vuoi effettivamente includere. – mabraham

7

Aggiungere -m alla risposta sopra indicata per eliminare le directory vuote.

2

rsync includono escludere Esempi di motivo:

"*"   means everything 
"dir1"  transfers empty directory [dir1] 
"dir*"  transfers empty directories like: "dir1", "dir2", "dir3", etc... 
"file*"  transfers files whose names start with [file] 
"dir**"  transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc... 
"dir***" same as above 
"dir1/*" does nothing 
"dir1/**" does nothing 
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc... 

e ultima nota è che semplicemente dont si basano su asterischi che vengono utilizzati in principio per valutare i percorsi; come "**dir" (va bene usarli per cartelle singole o file ma non per percorsi) e notare che più di due asterischi non funzionano per i nomi dei file.

+0

La tua risposta è l'unica utilizzabile perché spieghi il comportamento generale. Le altre risposte sono troppo specifiche secondo l'OP ma ogni situazione ha bisogno di un'altra soluzione! Mi ha aiutato molto! –

+0

@AlBundy Sono contento! – TechJS