Ich möchte nur bestimmte Dateitypen synchronisieren (z. B. .py
) und ich möchte Dateien in einigen Verzeichnissen ausschließen (z. B. venv
).
Folgendes habe ich versucht:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Aber es funktioniert nicht.
Was übersehe ich?
Ich bin auch der Antwort auf diese Frage gefolgt, aber sie hat nicht geholfen.
Akzeptierte Antwort:
venv/
muss vorher ausgeschlossen werden */
ist enthalten:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Die Subtilität ist, dass rsync
verarbeitet die Regeln der Reihe nach und die erste übereinstimmende Regel gewinnt. Wenn also --include='*/'
steht vor --exclude='venv/'
, dann das Verzeichnis venv/
wird durch --include='*/'
eingeschlossen und die Ausschlussregel wird nie konsultiert.
Können wir das vereinfachen?
Warum brauchen wir --include='*/'
und --exclude='*'
? Warum ist --exclude=venv/ --include='*.py'
nicht ausreichend?
Standardmäßig werden Dateien/Verzeichnisse eingeschlossen. Überlegen Sie also:
rsync -avz --exclude='venv/' --include='*.py' source target
Dies würde alles außer Dateien oder Verzeichnissen unter venv/
einschließen . Sie wollen aber nur .py
Dateien. Das bedeutet, dass wir andere Dateien explizit mit --exclude='*'
ausschließen müssen .
--exclude='*'
schließt beides aus Dateien und Verzeichnisse. Wenn wir also --exclude='*'
angeben , dann würden alle Verzeichnisse ausgeschlossen und nur die .py
Dateien würde das Root-Verzeichnis gefunden werden. .py
Dateien in Unterverzeichnissen würden nie gefunden, weil rsync
sucht nicht in ausgeschlossenen Verzeichnissen. Also, wenn wir --exclude='*'
haben , müssen wir ihm --include='*/'
voranstellen um sicherzustellen, dass der Inhalt aller Verzeichnisse durchsucht wird.