Ungefähre atomare Verschiebung zwischen Dateisystemen?

16

Ich muss unter Ubuntu einige Dateien von einem Dateisystem in ein anderes verschieben. Es ist jedoch sehr wichtig, dass die Dateien am Zielort niemals als teilweise oder unvollständige Dateien vorhanden sind, zumindest nicht unter dem richtigen Dateinamen.

Bisher besteht meine einzige Lösung darin, ein Skript zu schreiben, das jede Datei aufnimmt, sie in einen temporären Namen am Ziel kopiert, sie am Ziel in den ursprünglichen Dateinamen umbenennt (was meines Erachtens atomar sein sollte) und schließlich die Ursprungsdatei löscht .

Das Schreiben und Debuggen eines Skripts scheint jedoch für diese Aufgabe überflüssig zu sein. Gibt es einen Weg oder ein Werkzeug, das dies bereits von Haus aus tut?

Niels2000
quelle
8
Ich spüre ein xy-Problem. Warum brauchst du das?
Henning - Monica
3
@henning Es gibt viele mögliche Gründe, daher ist dies eine gute Frage. Zum Beispiel ein Programm, das automatisch versucht, Dateien mit einem Dateinamen zu verarbeiten, der einem bestimmten regulären Ausdruck entspricht (der jedoch aus bürokratischen Gründen vorübergehend nicht deaktiviert werden kann). Oder vielleicht ein Backup-System, das Dateien auf dauerhaften, aber schreibgeschützten Medien speichert.
wizzwizz4
1
@henning Ich brauche es, weil ich eine Reihe von Caches habe, die aus verschiedenen Speichern gelesen werden, aber einer ist fast voll und muss aus dem Dienst genommen werden. Dementsprechend muss jede Datei, sofern sie an einem der Speicherorte vorhanden ist, vollständig und intakt sein. Andernfalls besteht eine Wettlaufsituation zwischen dem Beginn und dem Ende einer Übertragung, bei der ein Cache eine unvollständige Datei abrufen (und beibehalten) kann.
Niels2000

Antworten:

27

rsynckopiert in temporäre Dateinamen (siehe z. B. Rsync temporäre Dateierweiterung und Rsync - erstellt es während der Übertragung eine temporäre Datei ? ), sofern Sie diese --inplaceOption nicht verwenden. Sie werden erst umbenannt, nachdem die Datei erfolgreich übertragen wurde. rsynclöscht auch alle Zieldateien, die nur teilweise übertragen wurden (z. B. aufgrund einer vollen Festplatte oder eines anderen Fehlers).

Es gibt auch eine --remove-source-filesOption, mit der die Quelldatei (en) nach erfolgreicher Übertragung gelöscht werden. rsyncWeitere Informationen finden Sie auf der Manpage.

Wenn Sie das alles zusammenfassen, können Sie Folgendes verwenden:

rsync -ax --remove-source-files source/ target/

Diese Option ist besonders nützlich für Aufgaben wie das Verschieben von Dateien aus einer "eingehenden" Warteschlange oder ähnlich dem Verzeichnis, in dem sie verarbeitet werden.

Wenn es sich um einen einmaligen Spiegel handelt, können Sie ihn alternativ auch rsyncohne die --remove-source-filesOption verwenden. Sie können die Quelldateien später löschen, wenn Sie möchten / müssen.

cas
quelle
Ich dachte, dass es ein gutes Werkzeug für den Job geben würde. Vielen Dank!
Niels2000
@ Niels2000 Ich kann mich nicht erinnern, ob ich jemals diese rsync-Option verwendet habe, aber was Sie wollten, hörte sich so an, als ob das rsyncmöglich wäre, und ich wusste, dass es Dateien mit einem temporären Namen übertrug (sofern Sie ihn nicht verwenden --inplace), also habe ich nachgeschaut in man rsyncund gefunden --remove-source-files. rsyncist ein gutes Werkzeug, um zunächst fast jede Dateiübertragungsaufgabe zu überprüfen.
cas