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.