it-swarm.com.de

Mit Rsync schließen Sie Optionen ein und aus, um Verzeichnis und Datei nach Muster einzuschließen

Ich habe Probleme, meine rsync-Syntax richtig zu verstehen, und ich frage mich, ob mein Szenario tatsächlich mit rsync gehandhabt werden kann. Zuerst habe ich bestätigt, dass rsync zwischen meinem lokalen Host und meinem Remote-Host einwandfrei funktioniert. Die direkte Synchronisierung eines Verzeichnisses ist erfolgreich.

So sieht mein Dateisystem aus:

uploads/
  1260000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1270000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1280000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg

Ich möchte rsync nur für Dateien ausführen, die mit "file_11_" in den Unterverzeichnissen beginnen, und ich möchte nur einen rsync-Job ausführen können, um alle diese Dateien in den Unterverzeichnissen zu synchronisieren.

Hier ist der Befehl, den ich versuche:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

Dies führt dazu, dass in meinem Probelauf 0 Dateien für die Übertragung markiert werden. Ich habe verschiedene andere Kombinationen von --include- und --exclude-Anweisungen ausprobiert, aber entweder weiterhin keine Ergebnisse erhalten oder alles so, als ob keine Einschluss- oder Ausschlussoptionen festgelegt worden wären.

Hat jemand eine Idee, wie das geht?

58
Sheldon Chang

Das Problem ist, dass --exclude="*" Sagt, dass das 1260000000/ - Verzeichnis ausgeschlossen werden soll. Daher überprüft rsync niemals den Inhalt dieses Verzeichnisses, bemerkt also nie, dass das Verzeichnis Dateien enthält, die wäre mit Ihrem --include abgeglichen worden.

Ich denke, das, was Sie am ehesten wollen, ist Folgendes:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(Dies beinhaltet alle Verzeichnisse und alle Dateien, die mit file_11*.jpg übereinstimmen, aber keine anderen Dateien) oder vielleicht dies:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(Dasselbe Konzept, aber viel wählerischer in Bezug auf die darin enthaltenen Verzeichnisse).

102
ruakh

rsync include exclude pattern Beispiele:

"*"         means everything
"dir1"      transfers empty directory [dir1]
"dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*"     transfers files whose names start with [file]
"dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***"    same as above
"dir1/*"    does nothing
"dir1/**"   does nothing
"dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

Und die letzte Anmerkung ist, dass Sie sich einfach nicht auf Sternchen verlassen müssen, die zu Beginn für die Bewertung von Pfaden verwendet werden. mögen "**dir" (es ist in Ordnung, sie für einzelne Ordner oder Dateien zu verwenden, jedoch nicht für Pfade) und beachten Sie, dass mehr als zwei Sternchen für Dateinamen nicht funktionieren.

19
AmirHossein

Fügen Sie -m zu der oben empfohlenen Antwort hinzu, um leere Verzeichnisse zu bereinigen.

8
brandon