Was passiert, wenn der Linux- mv
Befehl unterbrochen wird? Angenommen, ich verschiebe ein ganzes Verzeichnis an einen anderen Ort und unterbreche es, während es sich bewegt. Wird das Quellverzeichnis noch unberührt bleiben?
Wenn Sie ein Verzeichnis im selben Dateisystem verschieben, verschieben Sie nur den Verzeichniseintrag von einem Speicherort im Dateisystem an einen anderen. ZB mv /source/dir /target/dir
löscht der Verzeichniseintrag von dir
aus /source
und erstellt einen neuen in /target
. Dies geschieht durch einen atomaren Systemaufruf (dh unterbrechungsfrei). Der Inode, der sowohl die Verzeichniseinträge dir
als auch den eigentlichen Inhalt des Verzeichnisses enthält, ist nicht betroffen.
Wenn Sie das Verzeichnis von einem Dateisystem in ein anderes verschieben, werden alle Dateien zuerst in das neue Dateisystem kopiert und anschließend von dem ursprünglichen Dateisystem getrennt. Wenn Sie mv
den Kopiervorgang unterbrechen , erhalten Sie möglicherweise zwei Kopien einiger Dateien - am alten und am neuen Speicherort.
fsck
(die höchstwahrscheinlich beim Neustart automatisch ausgeführt wird, da die Diskette nicht ordnungsgemäß abgemeldet wurde).strace mv /fs1/dir /fs2/
- Das allerletzte, was mv tut, ist,unlinkat
alle Quelldateien gleichzeitig aufzurufen (nicht eine nach der anderen, während sie kopiert werden).Die GNU-Implementierung iteriert über die Argumente in der Befehlszeile, versucht zuerst, sie umzubenennen, und wenn dies fehlschlägt, kopiert sie die Quelle rekursiv und löscht sie dann rekursiv. Damit
Löschen wird ein vor dem Kopieren b , und startet nicht alles in dem Löschen ein , bevor die Zielkopie abgeschlossen ist.
Beachten Sie, dass dies nur für die GNU-Implementierung gilt.
Zur Verdeutlichung: Wenn a ein Verzeichnis ist, das d und e enthält , und b eine Datei ist, lautet die Reihenfolge
quelle
mv
, also nicht nur mit GNU.Sie verschieben ein Verzeichnis, unterbrechen das Verschieben und das ursprüngliche Verzeichnis bleibt erhalten:
Wenn Sie mehrere Verzeichnisse verschieben, bleibt jedes Verzeichnis entweder an der Quelle oder am Ziel erhalten, je nachdem, wann Sie unterbrochen haben:
Wie ich zu meiner Antwort kam:
Als Test habe ich einen großen Ordner in ein NFS-Verzeichnis kopiert, unterbrochen, und die Anzahl der Dateien in meinem großen Quellordner blieb gleich, und der Teilinhalt wurde im NFS-Verzeichnis belassen. Ich habe "find. -Type f | wc -l" verwendet, um dies zu überprüfen.
Sieht so aus, als ob Simons Antwort richtig ist.
quelle
Die akzeptierte Antwort ist definitiv falsch, wenn es darum geht, zwischen Dateisystemen zu wechseln - eine Tatsache, die mir schon ein paar Mal große Probleme erspart hat. Wenn Sie ein Verzeichnis verschieben, das Unterverzeichnisse enthält, wird keine Datei in einem Unterverzeichnis gelöscht, bevor das gesamte Unterverzeichnis kopiert wurde. Dies ist übrigens die eigentliche Bedeutung von "Objekt für Objekt" - ein Unterverzeichnis ist ein Objekt (eine Datei), und daher muss seine Integrität durch eine vollständige Kopie am Ziel erhalten bleiben, bevor etwas gelöscht werden kann. Daher erscheint mir die Antwort von Simon als die richtige.
quelle
Nein. Mv arbeitet Objekt für Objekt, sodass Objekte, die bereits verarbeitet wurden, aus der Quelle entfernt werden.
quelle
Auf jeden Fall nein. Die Bewegung erfolgt Objekt für Objekt. Das Objekt, das bis zur Unterbrechungsstelle zum Ziel bewegt wurde, soll daher in der Quelle nicht mehr vorhanden sein.
Wenn mv für eine große Datei (zwischen verschiedenen) ausgegeben wurde und diese unterbrochen wurde, ist die Quelle intakt. Auf dem Ziel sehen Sie eine unvollständige Datei bis zur Unterbrechung.
Sie können die MV jedoch mit demselben Befehl wiederherstellen und der Vorgang wird fortgesetzt.
quelle
Wenn Sie mv unterbrechen möchten, weil Sie die Verbindung zum Terminal trennen möchten, können Sie es einfach in den Hintergrund senden:
quelle