Voglio sincronizzare solo alcuni tipi di file (ad es. .py ) e voglio escludere i file in alcune directory (ad es. venv ).
Questo è quello che ho provato:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Ma non funziona.
Cosa mi sto perdendo?
Ho anche seguito la risposta a questa domanda ma non ha aiutato.
Risposta accettata:
venv/ deve essere escluso prima */ è incluso:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
La sottigliezza è che rsync elabora le regole in ordine e vince la prima regola corrispondente. Quindi, se --include='*/' è prima di --exclude='venv/' , quindi la directory venv/ è incluso da --include='*/' e la regola di esclusione non viene mai consultata.
Potremmo semplificarlo?
Perché abbiamo bisogno di --include='*/' e --exclude='*' ? Perché non è --exclude=venv/ --include='*.py' sufficiente?
L'impostazione predefinita è includere file/directory. Quindi, considera:
rsync -avz --exclude='venv/' --include='*.py' source target
Ciò includerebbe tutto tranne i file o le directory in venv/ . Tuttavia, vuoi solo .py File. Ciò significa che dobbiamo escludere esplicitamente altri file con --exclude='*' .
--exclude='*' esclude entrambi file e directory. Quindi, se specifichiamo --exclude='*' , verranno escluse tutte le directory e solo .py file che la directory principale verrebbe trovata. .py i file nelle sottodirectory non sarebbero mai stati trovati perché rsync non esamina le directory escluse. Quindi, se abbiamo --exclude='*' , dobbiamo precederlo con --include='*/' per garantire che i contenuti di tutte le directory vengano esplorati.