GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was passiert, wenn mv unterbrochen wird?

Wenn Sie ein Verzeichnis auf dasselbe Dateisystem verschieben, Sie verschieben nur den Verzeichniseintrag von einer Stelle im Dateisystem an eine andere. Beispiel:mv /source/dir /target/dir löscht den Verzeichniseintrag von dir ab /source und erstellen Sie ein neues in /target . Dies geschieht durch einen atomaren Systemaufruf (d. h. unterbrechungsfrei). Der Inode, der die Verzeichniseinträge von dir enthält sowie der eigentliche Inhalt des Verzeichnisses selbst ist davon nicht betroffen.

Wenn Sie das Verzeichnis von einem Dateisystem in ein anderes verschieben, Alle Dateien werden zuerst in das neue Dateisystem kopiert und dann vom ursprünglichen getrennt. Wenn Sie also mv unterbrechen Während des Kopierens erhalten Sie möglicherweise zwei Kopien einiger Dateien – am alten Speicherort und am neuen.


Die GNU-Implementierung iteriert über die Argumente auf der Befehlszeile, versucht zuerst, sie umzubenennen, und wenn dies fehlschlägt, kopiert sie rekursiv die Quelle und löscht sie dann rekursiv. Also

mv a b c/

löscht a bevor Sie b kopieren , und fängt nicht an, irgendetwas in a zu löschen bevor die Zielkopie abgeschlossen ist.

Beachten Sie, dass dies nur für die GNU-Implementierung gilt.

Zur Klarstellung: wenn ein ist ein Verzeichnis, das d enthält und e , und b eine Datei ist, lautet die Reihenfolge

  • c/a erstellen
  • kopiere a/d -> c/a/d
  • kopiere a/e -> c/a/e
  • Lösche ein/d
  • lösche a/e
  • löschen
  • Kopie b -> c/b
  • lösche b

Sie verschieben ein Verzeichnis, unterbrechen das Verschieben und das ursprüngliche Verzeichnis bleibt intakt:

$ mv a b/

Wenn Sie mehrere Verzeichnisse verschieben, bleibt jedes entweder auf der Quelle oder dem Ziel intakt, 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 Teile des Inhalts blieben im NFS-Verzeichnis. Ich habe "find . -type f | wc -l" verwendet, um dies zu überprüfen.

Sieht so aus, als wäre Simons Antwort richtig.


Linux
  1. Wie bewegt man sich ein Verzeichnis nach unten?

  2. Was gibt der Befehl Ls -al .* zurück?

  3. Was passiert, wenn ich Plymouth deaktiviere und deinstalliere?

  4. Was ist Doppelpunkt (..) und Einzelpunkt (.) in Linux?

  5. Was ist der schnellste Weg, um unter Linux eine Million Bilder von einem Verzeichnis in ein anderes zu verschieben?

Was sind Microservices? Einführung in die Microservices-Architektur

Rsync-Filter:Nur ein Muster kopieren?

Wofür sind Inodes gut?

Was passiert, wenn sich ein Thread verzweigt?

Was versteht man unter Mounten eines Geräts unter Linux?

Was gibt pwd aus?