Chcę synchronizować tylko niektóre typy plików (np. .py
) I chcę wykluczyć pliki z niektórych katalogów (np venv
.).
Oto, co próbowałem:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Ale to nie działa.
czego mi brakuje?
Odpowiedziałem też na to pytanie, ale to nie pomogło.
--include='*/'
?Odpowiedzi:
venv/
należy wykluczyć, zanim*/
zostanie uwzględniony:Subtelność polega na tym
rsync
, że przetwarza reguły w kolejności i wygrywa pierwsza pasująca reguła. Tak więc, jeśli--include='*/'
jest wcześniej--exclude='venv/'
, katalogvenv/
jest uwzględniony przez--include='*/'
i reguła wykluczenia nigdy nie jest sprawdzana.Czy możemy to uprościć?
Domyślnie dołączane są pliki / katalogi. Zastanów się:
Obejmuje to wszystko oprócz plików lub katalogów w
venv/
. Ty jednak potrzebujesz tylko.py
plików. Oznacza to, że musimy jawnie wykluczyć inne pliki za pomocą--exclude='*'
.--exclude='*'
wyklucza zarówno pliki, jak i katalogi. Jeśli więc określimy--exclude='*'
, wszystkie katalogi zostaną wykluczone i.py
zostaną znalezione tylko pliki z katalogu głównego..py
pliki w podkatalogach nigdy nie zostaną znalezione, ponieważrsync
nie przeglądają wykluczonych katalogów. Tak więc, jeśli mamy--exclude='*'
, musimy go poprzedzić,--include='*/'
aby zapewnić zbadanie zawartości wszystkich katalogów.źródło
--include='*/'
i--exclude='*'
? Dlaczego tylko--exclude=venv/ --include='*.py'
nie działa?