Verwenden Sie die Ausgabe rsync - dry-run erneut, um die eigentliche Übertragung zu einem späteren Zeitpunkt zu beschleunigen

23

Normalerweise mache ich das, rsync -nbevor ich ein tatsächliches mache rsync. Die Sache ist, wie könnte ich den zweiten Durchlauf automatisieren, um genau die Liste wiederzuverwenden, die mit erzeugt wurde --dry-run?

Ich meine, wenn ich rsync -ndann laufe, bekomme ich eine Simulation dessen, was passieren rsyncwürde. Meine Idee wäre, diese Ausgabe zu nehmen, sie zu verarbeiten und dann irgendwie rsyncnur --include-fromdiese Ausgabe zu machen, so dass die vollständige Liste nur einmal berechnet werden muss.

Wenn dies nicht einmal Sinn macht, lassen Sie es mich bitte wissen.

Übrigens neige ich dazu, zu verwenden rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Wenn Sie auch einen Vorschlag haben, welche Optionen Sie verwenden möchten, lassen Sie es mich bitte wissen. Ich versuche, den Inhalt einer externen Festplatte (die nur Bilder, Videos und Dokumente enthält) auf eine andere externe Festplatte zu kopieren.

Manuel
quelle
Sie können versuchen, die Ausgabe des --dry-runBefehls in eine Datei umzuleiten (z. B. rsync --dry-run -avz SOURCE DEST > include.txt), indem Sie alle Zeilen, die keine Dateien / Pfade sind, aus include.txt entfernen und ausführen rsync --include-from include.txt.
ThatGuy
Dieser letzte Befehl sollte sein rsync --include-from include.txt --exclude=* SOURCE DEST. Weitere Informationen finden Sie unter stackoverflow.com/a/19296415/1765910 .
ThatGuy
Ja, das ist die Idee, aber ich weiß nicht, wie ich das tun soll (und ich hätte gerne die Zustimmung von jemandem, der wirklich weiß, was er tut). Ich benutze nur, rsyncaber ich weiß nichts von Shell-Skripten / Bash ...
Manuel

Antworten:

18

Es ist durchaus möglich, die bei einem Probelauf erzeugte Dateiliste als Include-Datei zu verwenden. Im Idealfall sollten jedoch die zusätzlichen Zeilen am oberen und unteren Rand der Probelaufausgabe gelöscht werden.

Beispielausgabe:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Um diese Zeilen zu entfernen, leiten Sie die rsyncAusgabe in headund in tail. Speichern Sie dann die verarbeitete Ausgabe in einer Include-Datei:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Zum Schluss teilen Sie uns rsyncmit, dass Sie die generierte Include-Datei verwenden möchten (fügen Sie nach Wunsch weitere Optionen hinzu):

rsync --include-from=include.txt --exclude=* source/ dest/

Dieser Typ
quelle
Das Problem dabei ist, dass es nicht mit Dateien zurechtkommt, die gelöscht werden sollten. Und ist diese Methode von tail/ headrobust genug, um sicherzustellen, dass nur die Liste der Dateien vorhanden ist?
Manuel
Durch --deletedas Hinzufügen werden Dateien, die aus den Quellverzeichnissen gelöscht wurden, auch aus den Zielverzeichnissen gelöscht, zumindest auf dem Computer, auf dem ich es ausprobiert habe. Sie können den tail/ headTeil komplett weglassen. rsyncinterpretiert jede Zeile in der Include-Datei als Dateinamen und ignoriert einfach nicht vorhandene Dateien. In diesem Fall geschieht nichts, wenn Sie die zusätzlichen Zeilen beibehalten (es sei denn, Sie haben Dateien mit dem Namen "Liste inkrementeller Dateien senden" usw.) Diese Dateien werden ebenfalls kopiert.
ThatGuy