Warum ist mv so viel schneller als cp? Wie kann ich mich von einem falschen mv-Befehl erholen?

17

Ich habe versehentlich in FileZilla einen Ordner in einen anderen gezogen und dort abgelegt.

~/big_folder
~/some_other_folder

Der Ordner, der verschoben wurde, ist sehr groß. Es enthält Hunderttausende von Dateien (node_modules, kleine Bilddateien, viele Ordner)

Was so seltsam ist, ist, dass das Bewegen abgeschlossen ist, nachdem ich meine Maus loslasse. Der Ordner "big_folder" wird in "some_other_folder" verschoben.

~/some_other_folder/big_folder

(Es gibt keine big_folderin der ~/nach dem Umzug)

Dann erkenne ich den Fehler und versuche, zurückzukehren, aber es schlägt sowohl auf FileZilla als auch auf dem Terminal fehl.

Dann muss ich cp -rDateien zurückkopieren, da serverseitige Codes auf diese Dateien zugreifen~/big_folder

Und es dauert ewig zu warten ...

Was soll ich machen?

Übrigens, hier ist die Ausgabe von FileZilla (es ist der Fehler beim Zurückbewegen):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'
AGamePlayer
quelle
37
Ah, die nützlichste Fehlermeldung received failure with description 'Failure'.
Captain Man
3
Gehen Sie zu einem Terminal und geben Sie den Befehl ein mv /root/some_other_folder/big_folder /root/big_folder. Welche Fehlermeldung erhalten Sie?
Strg-Alt-Delor
Ich würde wahrscheinlich mitcp -al
Nemo
1
Die mv vs cpFrage von OP wird angesprochen, aber ich würde gerne hören, warum er den Ordner sofort in die eine, aber nicht in die andere Richtung verschieben konnte.
user1717828
4
Grundsätzlich aus dem gleichen Grund, dass es viel schneller geht, ein Buch von einem Raum in einen anderen zu verschieben, als eine Kopie des Buches zu erstellen.
David Richerby

Antworten:

63

Wenn ein Verzeichnis verschoben im gleichen Dateisystem (die gleiche Partition), dann alles , was benötigt wird , ist der Dateipfad des Verzeichnisses umbenennen. Es müssen keine Daten außer dem Verzeichniseintrag für das Verzeichnis selbst geändert werden.

Beim Kopieren von Verzeichnissen müssen die Daten für jede einzelne Datei dupliziert werden. Dazu müssen alle Quelldaten gelesen und am Zielort geschrieben werden.

Wenn Sie ein Verzeichnis zwischen Dateisystemen verschieben, müssen Sie die Daten auf das Ziel kopieren und von der Quelle entfernen. Dies würde ungefähr so ​​lange dauern, wie das Kopieren (Duplizieren) der Daten in einem einzelnen Dateisystem.


Wenn FileZilla erfolgreich das Verzeichnis aus umbenannt ~/big_folderzu ~/some_other_folder/big_folder, dann würde ich zurückkommen, dass die Verwendung

mv ~/some_other_folder/big_folder ~/big_folder

... nachdem Sie zuerst sichergestellt haben, dass kein Verzeichnis aufgerufen wurde ~/big_folder(wenn dies der Fall ist, wird der Verschiebevorgang als Unterordner big_foldervon some_other_folderin das ~/big_folderVerzeichnis verschoben).

Kusalananda
quelle
6
Oh ... ist das der Grund, warum ich in der Ausgabe das Wort "Umbenennen" anstatt "Bewegen" sehe?
AGamePlayer
2
@AGamePlayer Ja, richtig.
Kusalananda
4
@AGamePlayer "Failure" ist leider keine gute Fehlerbeschreibung. Ich hätte verwendet, mv ~/some_other_folder/big_folder ~/nachdem ich sichergestellt hatte, dass sich keine andere big_folderim Home-Verzeichnis befindet. Ich habe FileZilla noch nie benutzt.
Kusalananda
10
Ein weiterer Grund, nicht von Windows-GUI-Tools abhängig zu sein, um einige Dateien unter Unix zu pflegen.
Mark Stewart
4
@ MarkStewart, warum "unter Unix" am Ende Ihres Kommentars ?; Gibt es eine Zeit, in der es eine gute Idee ist?
Strg-Alt-Delor
11

Die vorhandene Antwort ist großartig, aber ich möchte sie ein wenig erweitern, indem ich genau zeige, was passiert, wenn Sie verschieben, und nicht, wenn Sie eine Datei kopieren. Wenn Sie sich die Syscalls während einer Kopie ansehen, sehen Sie:

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

Dadurch wird die Quelldatei geöffnet und eine zweite Datei erstellt. Es liest dann den Inhalt der Quelldatei in den Speicher und schreibt diesen Speicher in die Zieldatei. Dies erfordert mehrere Kontextwechsel und einige Datenträger-E / A, die für große Dateien sehr hoch sein können. Wenn Sie jedoch eine Datei verschieben, wird Folgendes angezeigt:

rename("hello1.txt", "hello2.txt")         = 0

Beachten Sie, dass die Datei nur umbenannt wird, wenn sie sich auf derselben Partition auf derselben physischen Festplatte befindet. Wenn Sie eine riesige Datei mit mehreren Gigabyte erstellen und sie dann zwischen zwei Speicherorten in Ihrem Zuhause verschieben, werden Sie feststellen, dass die Aktion sofort abgeschlossen ist. Wenn Sie es andererseits auf ein externes Gerät verschieben, dauert das Verschieben so lange, wie Sie es verwendet haben cp. Dies liegt daran, dass das Verschieben einer Datei nur durch Umbenennen erfolgen kann, wenn sie sich auf derselben Partition befindet.

Wald
quelle
Das OP hat ein Verzeichnis verschoben, keine Datei.
AL
Es gilt trotzdem, es sei denn, OP verschiebt leere Ordner, was der einzige Fall ist, in dem keine Dateien betroffen sind
glace
@AL In Unix-ähnlichen Systemen ist alles eine Datei.
Thegs
@AL Eine Textdatei war nur ein Beispiel. Für ein Verzeichnis ist der einzige Unterschied, dass Sie einige getdents()und mkdir()Anrufe haben würden, die herum gestreut werden.
Wald