Comprensione dei modelli di inclusione / esclusione di rsync


8

Voglio trasferire N file da un sistema remoto, usando un modello:

ssh remote ls target/
2013-08-01.mjson.gz
2014-07-04.mjson.gz
2014-07-09.mjson.gz
2014-08-12.mjson.gz
...

Voglio solo i 2014-07*file. I miei tentativi finora:

rsync -a --dry-run --verbose --include="2014-07-*" remote:target .
# transfers everything

rsync -a --dry-run --verbose --include="2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --exclude="*" --include="2014-07-*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="*/2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="***/2014-07-*" --exclude="*" remote:target .
# transfers nothing

So che posso usare --files-from per indicare quali file voglio esattamente, ma è una seccatura da fare.

Non ho mai capito come usare correttamente include / exclude per fare quello che voglio. La pagina man afferma:

e si agisce sul primo modello di corrispondenza: se si tratta di un modello di esclusione, quel file viene ignorato; se si tratta di un modello di inclusione, quel nome file non viene ignorato; se non viene trovato alcun modello corrispondente, il nome file non viene ignorato.

Leggendo questo, ho presunto che se includesse prima, e il nome del file corrispondesse, allora la parte "nome del file non viene ignorato" avrebbe avuto inizio. Apparentemente, mi sbaglio.

Più in basso nella pagina man, vedo:

Si noti che, quando si utilizza l'opzione --recursive (-r) (che è implicita da -a), ogni sottocomponente di ogni percorso viene visitato dall'alto verso il basso, quindi i modelli di inclusione / esclusione vengono applicati ricorsivamente al nome completo di ciascun sottocomponente

Da quando l'ho usato --recursive, quella causa è .stata saltata, a causa dell'esclusione globale?

Come trasferisco un sottoinsieme di file usando i modelli di inclusione ed esclusione?

Risposte:


9

Mentre puoi usare include ed exclude, penso che questa sarebbe una soluzione più semplice:

rsync -a --dry-run --verbose remote:'target/2014-07*' .

Il motivo per cui la variante include / exclude non funziona è che rsync non scende mai nella targetdirectory poiché è escluso dal *pattern e non corrisponde al pattern include (che corrisponde solo ai file target, non a targetse stesso). Per includere / escludere al lavoro dovresti fare qualcosa di simile

rsync -a --dry-run --verbose --include=target --include='target/2014-07-*' --exclude='*' remote:target .
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.