2012-03-31 4 views
32

Ich habe Probleme, meine Rsync-Syntax richtig zu machen, und ich frage mich, ob mein Szenario tatsächlich mit Rsync behandelt werden kann. Zuerst habe ich bestätigt, dass rsync zwischen meinem lokalen Host und meinem Remote-Host einwandfrei funktioniert. Eine direkte Synchronisierung für ein Verzeichnis ist erfolgreich.Verwenden von Rsync-Optionen zum Einschließen und Ausschließen von Verzeichnis und Datei nach Muster

Hier ist, was mein Dateisystem wie folgt aussieht:

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 

Was ich will ist laufen rsync auf Dateien nur tun, die mit „file_11_“ in den Unterverzeichnissen beginnen, und ich möchte in der Lage sein, nur einen rsync Job ausgeführt werden soll 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 zu 0 Dateien für die Übertragung in meinem Testlauf markiert werden. Ich habe verschiedene andere Kombinationen von - include und --exclude Anweisungen ausprobiert, aber entweder weiterhin keine Ergebnisse erhalten oder alles bekommen, als ob keine include- oder exclude-Optionen gesetzt wären.

Wer hat eine Idee, wie man das macht?

Antwort

67

Das Problem ist, dass --exclude="*" sagt die auszuschließen sind (zum Beispiel) das 1260000000/ Verzeichnis, so rsync prüft nie den Inhalt dieses Verzeichnisses, so merkt nie, dass das Verzeichnis enthält Dateien, die von Ihrem --include abgestimmt worden wäre.

Ich denke, die nächste Sache, was Sie wollen, ist dies:

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

(die alle Verzeichnisse enthalten, und alle Dateien file_11*.jpg, aber keine anderen Dateien passend) oder vielleicht dies:

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

(gleiches Konzept, aber viel wählerischer über die Verzeichnisse wird es enthalten).

+1

Danke! Das war genau das, was ich brauchte. Mein Szenario war eigentlich mehr oder weniger das, was Sie in Ihrem zweiten Beispiel beschrieben haben, aber ich habe meine Frage vereinfacht, um die Frage direkter zu machen. –

+0

@SheldonChang: Gern geschehen! – ruakh

+5

Beachten Sie die Wichtigkeit von (z. B.) --include = "* /" 'bei der Einbeziehung der ** übergeordneten ** Verzeichnisse der Dateien, die Sie tatsächlich einfügen möchten. – mabraham

7

Hinzufügen -m zu der empfohlenen Antwort oben, um leere Verzeichnisse zu löschen.

2

rsync sind Musterbeispiele ausschließen:

"*"   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 letzte Bemerkung ist, dass einfach auf den Sternchen verlassen nicht die für die Bewertung Pfade am Anfang verwendet werden; wie "**dir" (es ist in Ordnung, sie für einzelne Ordner oder Dateien, aber keine Pfade zu verwenden) und beachten Sie, dass mehr als zwei Sternchen nicht für Dateinamen funktionieren.

+0

Ihre Antwort ist die einzige, die verwendbar ist, weil Sie das allgemeine Verhalten erklären. Die anderen Antworten sind zu spezifisch nach dem OP, aber jede Situation braucht eine andere Lösung! Es hat mir sehr geholfen! –

+0

@AlBundy Im froh! – TechJS