Warum kopiert MV (1) Objekte, wenn die Berechtigung zum Verschieben verweigert wird?

7

Hat mvfungieren als cp(1)wenn die Erlaubnis für Prozess verweigert zu bewegen?

Wenn ja, ist es nicht gegen die Regel, eine Sache zu tun und es gut zu machen?

Reich
quelle

Antworten:

14

Die kurze Antwort ist, dass dies nicht der Fall ist.

mv ist definiert als:

Führen Sie Aktionen aus, die der rename()Funktion entsprechen

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. Dieser Effekt kann auftreten , wenn versucht wird, eine Datei zwischen Geräten zu verschieben. In diesem Fall ist das Umbenennen im Dateisystem nicht möglich. Um den Effekt des Verschiebens zu erzielen, kopieren Sie mvzuerst die Quelle an das Ziel und löschen Sie dann die Quelle. In der Tat mv /mnt/a/X /mnt/b/Yist im Wesentlichen gleichbedeutend mit cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X. Nur so kann das Verschieben von Dateien zwischen Geräten funktionieren.

Wenn Sie mvnicht berechtigt sind, diese Quelldatei zu löschen, wird ein Fehler gemeldet, aber zu diesem Zeitpunkt ist die Kopie bereits aufgetreten. Es ist nicht möglich, dies zu vermeiden, indem Sie die Berechtigungen im Voraus überprüfen, da sich die Berechtigungen möglicherweise während des Betriebs ändern.

Es gibt wirklich keine Möglichkeit, diese mögliche Möglichkeit zu verhindern, außer es unmöglich zu machen, Dateien zwischen Geräten zu verschieben. Die Wahl, mvzwischen einer Quelle und einem Ziel zuzulassen, vereinfacht die Dinge im allgemeinen Fall auf Kosten eines merkwürdigen (aber zerstörungsfreien) Verhaltens in diesen ungewöhnlichen Fällen.

Dies 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.

Michael Homer
quelle