Macht mv
agieren als cp(1)
wenn Erlaubnis zum Verschieben des Prozesses verweigert?
Wenn ja, ist es nicht gegen die Regel, eine Sache zu tun und es gut zu machen?
Akzeptierte Antwort:
Die kurze Antwort lautet:Nein.
mv
ist definiert als:
Aktionen ausführen, die rename()
entsprechen Funktion
rename()
kopiert keine Inhalte, sondern benennt sie einfach auf der Festplatte um. Es ist eine vollständig atomare Operation, die niemals teilweise vollständig fehlschlägt.
Das erzählt jedoch nicht die ganze Geschichte. Wo dieser Effekt kann Dies passiert, wenn Sie versuchen, eine Datei zwischen Geräten zu verschieben:In diesem Fall ist es nicht möglich, die Umbenennung im Dateisystem vorzunehmen. Um den Effekt des Bewegens zu haben, mv
kopiert zuerst die Quelle zum Ziel und löscht dann die Quelle. Tatsächlich mv /mnt/a/X /mnt/b/Y
entspricht im Wesentlichen cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X
. Nur so könnte das Verschieben von Dateien zwischen Geräten funktionieren.
Wenn mv
keine Berechtigung zum Löschen dieser Quelldatei hat, wird ein Fehler gemeldet, aber zu diesem Zeitpunkt ist die Kopie bereits erfolgt. Es ist nicht möglich, dies zu vermeiden, indem die Berechtigungen im Voraus überprüft werden, da sich die Berechtigungen aufgrund möglicher Race-Bedingungen während des Betriebs ändern.
Es gibt wirklich keine Möglichkeit, diese mögliche Eventualität zu verhindern, außer es unmöglich zu machen, Dateien zwischen Geräten überhaupt zu verschieben. Die Wahl, mv
zuzulassen zwischen jeder Quelle und jedem Ziel macht die Dinge im allgemeinen Fall einfacher, auf Kosten von seltsamem (aber nicht destruktivem) Verhalten in diesen ungewöhnlichen Fällen.
Das ist auch der Grund, warum das Verschieben einer großen Datei innerhalb eines einzelnen Geräts so viel schneller ist als das Verschieben auf ein anderes.