Rsync enthält nur bestimmte Dateitypen mit Ausnahme einiger Verzeichnisse

13

Ich möchte nur bestimmte Dateitypen (z. B. .py) rsyncieren und Dateien in einigen Verzeichnissen (z venv. B. ) ausschließen.

Folgendes habe ich versucht:

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

Aber es funktioniert nicht.

Was vermisse ich?

Ich folgte auch der Antwort auf diese Frage, aber es half nicht.

CentAu
quelle
Warum brauchst du die Initiale --include='*/'?
Charlie Parker
1
Wie erstellt man den Befehl, wenn ich rekursive Verzeichnisse habe, die ich nur einen Dateityp senden möchte? Es scheint, dass es dies nur für das Zielverzeichnis tut, wahrscheinlich wegen des letzten Ausschlusses, der alles ausschließt
Charlie Parker

Antworten:

16

venv/muss ausgeschlossen werden , bevor */ ist im Preis inbegriffen:

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

Die Subtilität ist , dass die rsyncProzesse Regeln um und die erste zutreffende Regel gewinnt. Wenn dies --include='*/'vorher --exclude='venv/'der Fall venv/ist , wird das Verzeichnis von eingeschlossen --include='*/'und die Ausschlussregel wird niemals konsultiert.

Könnten wir das vereinfachen?

Warum brauchen wir --include='*/'und --exclude='*'? Warum reicht das nicht --exclude=venv/ --include='*.py'aus?

Standardmäßig werden Dateien / Verzeichnisse eingeschlossen. Bedenken Sie also:

rsync -avz --exclude='venv/' --include='*.py' source target

Dies würde alles außer Dateien oder Verzeichnissen unter einschließen venv/. Sie möchten jedoch nur .pyDateien. Das bedeutet, dass wir andere Dateien mit explizit ausschließen müssen --exclude='*'.

--exclude='*'schließt sowohl Dateien als auch Verzeichnisse aus. Wenn wir also angeben --exclude='*', werden alle Verzeichnisse ausgeschlossen und nur die .pyDateien im Stammverzeichnis gefunden. .pyDateien in Unterverzeichnissen werden niemals gefunden, da rsyncsie keine ausgeschlossenen Verzeichnisse untersuchen. Wenn dies der Fall ist --exclude='*', müssen wir dem vorausgehen, --include='*/'um sicherzustellen, dass der Inhalt aller Verzeichnisse untersucht wird.

John1024
quelle
Groß! Vielen Dank! Nur nach meinem Verständnis, warum brauchen wir --include='*/'und --exclude='*'? Warum --exclude=venv/ --include='*.py'funktioniert nur nicht?
CentAu
1
@ CentAu Ich habe gerade die Antwort mit einer Diskussion darüber aktualisiert.
John1024
Wie erstellt man den Befehl, wenn ich rekursive Verzeichnisse habe, die ich nur einen Dateityp senden möchte? Es scheint, dass dies nur für das Zielverzeichnis der Fall ist, wahrscheinlich aufgrund des letzten Ausschlusses, der alles ausschließt.
Charlie Parker