Rsync, include solo alcuni tipi di file escludendo alcune directory


14

Voglio risincronizzare solo determinati 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.


perché hai bisogno dell'iniziale --include='*/'?
Charlie Parker,

1
Come si può creare il comando se ho directory ricorsive che voglio inviare solo un tipo di file. Sembra che lo faccia solo per la directory di destinazione probabilmente a causa dell'ultima esclusione che esclude tutto
Charlie Parker

Risposte:


17

venv/deve essere escluso prima di */ includere:

rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

La sottigliezza è che rsyncelabora le regole in ordine e vince la prima regola corrispondente. Quindi, se --include='*/'è prima --exclude='venv/', la directory venv/viene inclusa da --include='*/'e la regola di esclusione non viene mai consultata.

Potremmo semplificarlo?

Perché abbiamo bisogno --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ò include tutto tranne i file o le directory in venv/. Tuttavia, vuoi solo i .pyfile. Ciò significa che dobbiamo escludere esplicitamente altri file con --exclude='*'.

--exclude='*'esclude sia i file che le directory. Quindi, se specifichiamo --exclude='*', tutte le directory verrebbero escluse e .pyverranno trovati solo i file nella directory principale. .pyi file nelle sottodirectory non verranno mai trovati perché rsyncnon esaminano le directory escluse. Quindi, se lo abbiamo --exclude='*', dobbiamo precederlo --include='*/'per garantire che i contenuti di tutte le directory siano esplorati.


Grande! Grazie! Solo per mia comprensione, perché abbiamo bisogno --include='*/'e --exclude='*'? Perché solo --exclude=venv/ --include='*.py'non funziona?
CentAu,

1
@CentAu Ho appena aggiornato la risposta con una discussione di questo.
Giovanni 1024,

Come si può creare il comando se ho directory ricorsive che voglio inviare solo un tipo di file. Sembra che lo faccia solo per la directory di destinazione probabilmente a causa dell'ultima esclusione che esclude tutto.
Charlie Parker,

1
Bookmarking! Soprattutto per la finezza. Non riesco a pensare a nessun'altra utility CLI in cui l'ordine delle bandiere sia importante !
antortjim,
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.