Verwenden Sie rsync, um Dateien zwischen Verzeichnissen zu verschieben (nicht zu kopieren)?

54

Ich benutze rsync seit einiger Zeit, um Dateien zu kopieren. Nach meinem Verständnis ist rsync schneller als cp, wenn sich einige der zu übertragenden Dateien bereits im Zielverzeichnis befinden und nur die inkrementelle Differenz (dh die "Deltas") übertragen werden.

Wenn dies korrekt ist, hätte es einen Vorteil, rsync zu verwenden, um den Inhalt eines Ordners A , zum Beispiel eines Ordners B , zu verschieben, wobei B leer ist?

Der Ordner A enthält fast 1 TB Daten (und Millionen von Dateien). Die Übertragung würde über ein lokales Netzwerk erfolgen ( A und B befinden sich auf verschiedenen Dateisystemen, die beide auf einem Supercomputer installiert sind , z. B. A ist NFS und B ist Luster ).

Welche Flags sollte ich außerdem verwenden, um rsync aufzufordern , Dateien von A nach B zu verschieben (nicht zu kopieren) (dh A zu löschen, wenn die Übertragung erfolgreich abgeschlossen wurde)?

Amelio Vazquez-Reina
quelle
7
Ich glaube nicht rsyncersetzen zu können mv. Ich würde erwarten mv, dass die meisten Dateisystemtypen schneller sind, wenn sich Quelle und Ziel im selben Dateisystem befinden, da rsyncunabhängig davon eine Kopie erstellt werden müsste und mvwahrscheinlich einige Verzeichniseinträge geändert werden müssen. Das nächste, was ich zu einem finden kann, rsync mvist der --remove-source-filesBefehl, aber das entfernt keine Verzeichnisse.
JW013
1
Vielen Dank @ jw013! Zur Verdeutlichung befinden sich die Dateien auf verschiedenen Dateisystemen, und die Übertragung würde in einem Netzwerk erfolgen . Weißt du, ob das noch mvschneller machen würde ?
Amelio Vazquez-Reina
1
Nun, mvkann über ein Netzwerk nicht funktionieren - es würde einen lokalen Mount (zB NFS) angewiesen. Wenn der Engpass im Netzwerk liegt, rsyncwäre das wahrscheinlich schneller, als mvda rsyncKomprimierung machen kann.
JW013
2
Übrigens cphat die -uOption, Quelldatei zu kopieren, wenn es neuer als die Zieldatei ist oder wenn die Zieldatei fehlt
Ansturm

Antworten:

69

Sie können --remove-source-filesan rsync übergeben, um Dateien zu verschieben, anstatt sie zu kopieren.

In Ihrem Fall macht die Verwendung von rsync jedoch keinen Sinn, da das Ziel leer ist. Eine Ebene mverledigt die Arbeit so schnell wie möglich.

In Ihrem Fall kann sich die Wahl des Netzwerkprotokolls auf die Leistung auswirken, wenn Sie zwischen NFS, Samba, sshfs, sftp, rsync und ssh, tar piped in ssh usw. wählen. Die relative Geschwindigkeit dieser Methoden hängt davon ab Da es keine Möglichkeit gibt, allgemeine Ratschläge zu geben, müssen Sie Ihre eigenen Benchmarks ausführen.

Gilles 'SO - hör auf böse zu sein'
quelle
6
Nur um noch einmal zu wiederholen, was Caleb sagt: Wenn Sie sich Sorgen über Korruption machen, zum Beispiel durch ein flockiges Netzwerk, kann rsync sinnvoll sein, da es jede Datei, die es schreibt, überprüft, indem es die Blöcke beim Schreiben mit einer Prüfsumme versieht.
Daniel S. Sterling
5
Das --remove-source-fileslöscht nur die Dateien in der Quelle. Wenn Sie die Quelle löschen möchten, müssen Sie dann nach der erfolgreichen Ausführung von rsync keine rm -rf (oder findalle Verzeichnisse und Übergaben -delete) für die Quelle ausführen.
Trevor Boyd Smith
1
@ DanielS.Sterling rsync prüft die Blöcke nach dem Schreiben nicht (es ermittelt anhand von Prüfsummen, welche Teile der vorhandenen Dateien aktualisiert wurden und synchronisiert werden müssen). Sie können eine zweite Synchronisierung mit durchführen --checksum, um die Ergebnisse der ersten Synchronisierung zu überprüfen.
Clément
19

Da --remove-source-fileskeine Verzeichnisse entfernt werden, gebe ich die folgenden Befehle aus, um Dateien über ssh zu verschieben:

rsync -avh --progress --remove-source-files /home/user/mystuff/* [email protected]:/home/user/backup
find . -type d -empty -delete

Ich persönlich mag die --progressFunktion, da ich diese Übertragung manuell mache. Entfernen Sie es, wenn Sie ein Skript verwenden. Ich gehe davon aus, dass es Transfers geringfügig verlangsamt. Die findLöschoption des Befehls löscht nur leere Verzeichnisse - nicht verwenden rm -rf, da nicht leere Verzeichnisse gelöscht werden können, falls eine Datei nicht übertragen wurde. Die -deleteOption aktiviert die -depthOption, sodass leere Verzeichnisbäume von unten nach oben gelöscht werden.

Kristian
quelle
3
-deleteist viel schöner als -exec rmdir {} +etc
lkraav
1
Ich würde das Sternchen überspringen, weil und nur abschließende Schrägstriche / mit Pfaden haben, wenn Sie dies lokal tun. Wenn Sie Sternchen verwenden, überspringt rsync versteckte Dateien wie .htaccess oder .htpasswd (falls vorhanden)
Svetoslav Marinov
16

Wie Gilles sagte, gibt es im Allgemeinen keinen Vorteil, rsyncDateien zu verschieben, wenn mvderselbe Job einfacher erledigt wird, und es gibt keinen potenziellen Geschwindigkeitsgewinn zwischen normalen Dateisystemen.

Es gibt jedoch einige Male, in denen es einen Vorteil gibt. Insbesondere, wenn Sie Zweifel an der Stabilität der Quelle, des Ziels oder der Maschine haben, die die Arbeit rsyncerledigt, erhalten Sie mithilfe von die Möglichkeit , die Arbeit fortzusetzen. Dies kann ein beachtlicher Vorteil sein, wenn Sie eine sehr große Übertragung durchführen und Ihr Stromnetz beispielsweise unzuverlässig ist. Die Verwendung von rsync ist eine stabilere Methode, um im Falle eines Ausfalls eine Beschädigung der Daten zu vermeiden und dort fortzufahren, wo Sie aufgehört haben.

Caleb
quelle
4
Ich würde sagen, das ist ein großer Vorteil. In der Tat würde ich sagen, mvist nur besser, wenn das Ziel und die Quelle in der gleichen Partition sind, so dass mvnur die Metadaten der Datei bearbeitet werden, anstatt eine Kopie zu erstellen.
Nomen
2
Ich brauche rsyncstatt mv einmal, um die Ordnerstruktur beizubehalten (falls Sie sie verwenden --relative).
Sridhar Sarnobat
14

Wäre es von Vorteil, rsync zu verwenden, um den Inhalt eines Ordners A, beispielsweise eines Ordners B, zu verschieben, wobei B leer ist?

Ich befand mich in einer Situation, in der rsync schneller ist als mv, weil mv die Anzahl der Dateien im Verzeichnis nicht verarbeiten kann. Ich habe 1,8 Millionen Fotos von einer Überwachungskamera, die 20 Tage lief, und der Befehl mv wird mit einem Fehler beendet, da er keine Ressourcen zuweisen kann.

rsync scheint jedoch problemlos mit allen Dateien umzugehen.

shadowv
quelle
1

Wenn Sie Verzeichnisse rekursiv zusammenführen möchten ... verschieben Sie ein Verzeichnis in ein anderes Verzeichnis mit möglicherweise doppelten Verzeichnisnamen, dann finden Sie meine Antwort hier auf serverfault.com. mvleistet schlechte Arbeit, wenn Verzeichnisse mit demselben Namen existieren und rsyncjede Datei kopiert (Lese- und Schreibzugriff), anstatt sie nur zu verschieben (Lese- und Schreibzugriff auf Metadaten).

Peter
quelle
0

Es gibt keine Möglichkeit, Dateien mit rsync zu verschieben, wie dies mit dem Linux-Befehl mv möglich wäre. Mit --remove-source-files kopieren Sie im Wesentlichen Dateien in das Ziel und löschen dann Dateien (außer Verzeichnisse) aus der Quelle. Dies könnte Ihren Zweck zum Verschieben von Dateien erfüllen, aber Sie sparen KEINE Zeit oder I / O-Operationen.

Gehendra Acharya
quelle