So synchronisieren Sie nur neue Dateien

144

Ich versuche, rsync so einzurichten, dass mein Hauptwebserver mit dem Remoteserver synchronisiert wird, indem der späteren Datei eine neu generierte Datei hinzugefügt wird.

Hier ist der Befehl, den ich benutze:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

Es scheint jedoch, dass der Webserver trotz des '--update'-Flags tatsächlich alle Dateien überträgt. Ich habe verschiedene Flag-Kombinationen ausprobiert (z. B. '-a' weglassen und stattdessen '-uv' verwenden), aber keine hat geholfen. Ich frage mich also, wie ich den Befehl rsync so ändern kann, dass nur neu hinzugefügte Dateien gesendet werden. Vielen Dank

Super Mario
quelle
2
Wenn Sie Dateien mit dem Remote-Server synchronisieren möchten , sollte dies nicht der letzte sein? dh rsync /foo/bar remoteuser@remotehost:/foo/bar
ostrokach
Diese Webseite könnte Sie interessieren . Seien Sie auch vorsichtig mit dem Dateisystem. Wenn das Dateisystem des Servers nicht alle -aOptionen unterstützt (Eigentümer, Gruppe, Dauerwelle, ...), sollte dies die Ursache für unser Problem sein.
6.
2
Keine der Antworten behebt das Problem, bei dem die lokalen Dateien nicht vollständig auf das Remote-Ziel kopiert wurden und Sie nur neuere Dateien synchronisieren möchten.
Axel Bregnsbo
Ich habe gerade die -cOption gefunden. Es überspringt vorhandene Dateien basierend auf einer Prüfsumme, anstatt Änderungszeit oder -größe.
haheute

Antworten:

181

Von man rsync:

--ignore-existing       skip updating files that exist on receiver

--updatemacht etwas etwas anderes, was wahrscheinlich der Grund ist, warum Sie unerwartete Ergebnisse erhalten (siehe man rsync):

Dadurch wird rsync gezwungen, alle Dateien zu überspringen, die auf dem Ziel vorhanden sind und eine geänderte Zeit haben, die neuer als die Quelldatei ist . (Wenn eine vorhandene Zieldatei eine Änderungszeit aufweist, die der der Quelldatei entspricht, wird sie aktualisiert, wenn die Größen unterschiedlich sind.)

Chris Down
quelle
1
Nun, eigentlich habe ich den Befehl mit '--ignore-existing' anstelle von '--update' ausprobiert. Es wurde schnell beendet, aber die neuen Dateien werden nicht auf dem Remote-Host abgelegt. Irgendwelche Ideen? Vielen Dank
Supermario
13
Manpages saugen (das ist richtig, dass ich dorthin gegangen bin). --ignore-existingBedeutet dies, dass keine Dateien übertragen werden, die auf dem Empfänger vorhanden sind, oder dass keine Dateien übertragen werden, wenn auf dem Empfänger eine Datei / ein Ordner mit demselben Namen vorhanden ist?
Puk
7
--update nicht Dateien überspringen , wenn die mtimes identisch sind (das ist nicht , was die Formulierung impliziert). Ich habe das getestet. Ich glaube, der Wortlaut wäre besser zu verstehen, wenn "nur Quelldateien kopiert werden, die neuer sind als das Ziel".
Octopus
4
@Octopus "Es werden nur Quelldateien kopiert, die neuer als das Ziel sind" ... oder Quelldateien, deren Änderungszeit mit der der Zieldateien übereinstimmt, deren Größe jedoch unterschiedlich ist . Ich denke, das ist ein wichtiger Punkt. (Chris hat das bereits besprochen, danke)
Jonathan Komar
Sie benötigen also --ignore-existing und -r (rekursiv). -v (ausführlich) ist auch schön zu haben :-)
DutchUncle
40

In meinem Fall hatte ich ähnliche Probleme, da alle Dateien übertragen wurden und nicht nur die geänderten / neuen. Ich habe das gelöst, indem ich Parameter -t(anstelle von -a) und -P(äquivalent zu --partial --progress) verwendete:

rsync -h -v -r -P -t Quellenziel

Dies überträgt nur neue Dateien und Dateien, die bereits vorhanden, aber geändert sind. Dies -aführt zu einer übermäßigen Synchronisierung der Benutzer- und Gruppen-ID, die in meinem Fall nicht funktionieren kann, da ich auf meinen Quell- und Zielsystemen unterschiedliche Benutzer und Gruppen habe.

Die Parameter im Detail:

  • -h: vom Menschen lesbare Zahlen
  • -v: ausführlich
  • -r: in Verzeichnisse rekursieren
  • -P: --partial(teilweise übertragene Dateien behalten) +
            --progress(Fortschritt während der Übertragung anzeigen)
  • -t: Änderungszeiten einhalten
t0r0X
quelle
2
+1 für "-a macht zu viel" (in der Tat -rlptgoD, damit die Erlaubnis nicht abgeflacht wird, Gruppen und Besitzer erhalten bleiben - nicht meine typische spielsichere Sicherung ...)
Frank Nocke
2

Aus meiner Erfahrung mit rsync ist das Kopieren einer 1-TB-Partition zu groß, um effizient zu sein. Es dauert ewig, bis Rsync es verarbeitet. Tun Sie dies stattdessen in Unterverzeichnissen. Führen Sie also rsync für jedes Hauptunterverzeichnis aus. Es geht viel schneller, wenn es nicht Zehntausende von Dateien jonglieren muss.

Turgut Kalfaoglu
quelle
1
Möglicherweise ist Ihnen der Arbeitsspeicher ausgegangen, und Ihr System wurde ausgetauscht.
Marcel Burkhard
-2

Versuchen

rsync -zvrt --update SOURCE DESTN
Omega
quelle
8
Für das OP wäre eine etwas ausführlichere Erläuterung des obigen Befehls wünschenswert.
Peschke
von der Manpage `-u, --update überspringe Dateien, die neuer auf dem Receiver
sind`