Antworten:
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.
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
mv a b c/
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
mv
, also nicht nur mit GNU.
Sie verschieben ein Verzeichnis, unterbrechen das Verschieben und das ursprüngliche Verzeichnis bleibt erhalten:
$ mv a b/
Wenn Sie mehrere Verzeichnisse verschieben, bleibt jedes Verzeichnis entweder an der Quelle oder am Ziel erhalten, je nachdem, wann Sie unterbrochen haben:
$ mv a b c/
Wie ich zu meiner Antwort kam:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
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.
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.
Nein. Mv arbeitet Objekt für Objekt, sodass Objekte, die bereits verarbeitet wurden, aus der Quelle entfernt werden.
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.
Wenn Sie mv unterbrechen möchten, weil Sie die Verbindung zum Terminal trennen möchten, können Sie es einfach in den Hintergrund senden:
* press Ctrl+Z
# bg
# disown
fsck
(die höchstwahrscheinlich beim Neustart automatisch ausgeführt wird, da die Diskette nicht ordnungsgemäß abgemeldet wurde).