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.