mvist ein Shell -Befehl zum Umbenennen und Verschieben von Dateien und Verzeichnissen . Befinden sich beide Elemente auf demselben Dateisystem , benennt der Befehl die Dateien um; andernfalls werden die Elemente in das Zielverzeichnis kopiert und die alten Elemente entfernt (genauer: die Verknüpfung aufgehoben ). Um zwischen zwei Verzeichnissen zu verschieben, benötigt der Benutzer Schreibrechte für beide, da der Befehl den Inhalt beider Verzeichnisse ändert. Beim Umbenennen bleibt der Zeitstempel eines Elements unverändert.

Bei Unix -Implementierungen, die von AT&T Unix abgeleitet sind , werden cp, lnund als ein einziges Programm mit fest verlinktenmv Binärdateien implementiert .

Geschichte

Multics stellte einen Befehl zum Verschieben/Umbenennen von Dateien bereit move. Eine Version mit der Kurzform mv[ 1 ] erschien in Unix Version 1 [ 2 ] und wurde Teil des X/Open Portability Guide, Ausgabe 2 von 1987. [ 3 ] Die Version in den GNU Core Utilities wurde von Mike Parker, David MacKenzie und Jim Meyering geschrieben. [ 4 ] Der Befehl ist unter Windows über UnxUtils verfügbar . [ 5 ] Der Befehl wurde auf IBM i portiert . [ 6 ]

Optionen

Die meisten Implementierungen unterstützen:

  • -iInteraktiv ; der Befehl fordert den Benutzer auf, das Verschieben jeder Datei zu bestätigen, die eine vorhandene Datei überschreiben würde; überschreibt eine vorhergehende -fOption
  • -fErzwingt das Überschreiben vorhandener Dateien; überschreibt eine vorherige -iOption

Diese Optionen sind Teil der X/Open Portability Guidelines , die später die Grundlage für POSIX und SUS bildeten . Eine POSIX-konforme Implementierung muss diese unterstützen. [ 7 ]

Namenskonflikt

Wird eine Datei in einen Pfad verschoben, der auf eine bereits vorhandene Datei verweist, wird diese standardmäßig überschrieben . Befindet sich die vorhandene Datei in einem beschreibbaren Verzeichnis, obwohl sie nicht beschreibbar ist, fordert der Befehl den Benutzer zur Bestätigung des Überschreibens auf (bei Ausführung im Terminal), sofern keine -fentsprechende Option angegeben ist.

Versehentliches Überschreiben lässt sich mithilfe der GNU-Implementierung -n(langes Format: --no-clobber) verhindern. Alternativ überschreibt -u( --update) nur Zieldateien, die älter als die Quelldateien sind, -i( --interactive) fragt bei jedem Namenskonflikt nach einer Bestätigung und -b( --backup) benennt Zieldateien um, um ein Überschreiben zu verhindern.

Mehrdeutigkeiten entstehen, wenn eine Datei in einen Pfad verschoben wird, der auf ein bereits existierendes Verzeichnis verweist. Standardmäßig mvwird dies durch Verschieben der Datei innerhalb des Verzeichnisses behoben. Die GNU-Implementierung bietet eine -TOption, die versucht, das Verzeichnis stattdessen zu überschreiben. Eine Umkehroption -tmacht das Verschieben in das Verzeichnis explizit. [ 4 ]

Verschieben versus Kopieren und Entfernen

Das Verschieben von Dateien innerhalb desselben Dateisystems ist im Allgemeinen effizienter als das Kopieren der Datei und das anschließende Löschen des Originals. Auf Plattformen, die den rename()Systemaufruf nicht unterstützen , wird ein neuer Hardlink zum neuen Verzeichnis hinzugefügt und der ursprüngliche Link gelöscht. Auf die Daten der Datei wird nicht zugegriffen. Ein POSIX -konformes System implementiert diese Methode rename().

Ein solcher Vorgang ist deutlich einfacher und schneller als ein Kopier- und Verschiebevorgang. Die Inode- Nummer (i-Nummer) der Datei ändert sich nicht. Zum Lesen der Datei sind keine Berechtigungen erforderlich, da nur Kataloginformationen geändert werden. Da Quell- und Zielverzeichnis modifiziert werden, werden Einträge im Zielverzeichnis erstellt und im Quellverzeichnis gelöscht. Daher sind Schreibrechte in beiden Verzeichnissen erforderlich. Das Verschieben von Dateien zwischen Dateisystemen kann vollständig fehlschlagen oder automatisch als atomarer Kopier- und Löschvorgang ausgeführt werden; die genauen Details hängen von der Implementierung ab.

Das Verschieben eines Verzeichnisses von einem übergeordneten Verzeichnis in ein anderes erfordert Schreibrechte im zu verschiebenden Verzeichnis sowie Berechtigungen zum Ändern des alten und des neuen übergeordneten Verzeichnisses. Dies liegt daran, dass sich die i-Nummer des Verzeichniseintrags ".." (ein Alias ​​für das übergeordnete Verzeichnis) durch die Umbenennung ändert.

Beispiele

Der folgende Befehl benennt die Datei oder das Verzeichnis „foo“ in „bar“ um . Dabei wird vorausgesetzt, dass „bar“ zuvor noch kein existierendes Verzeichnis war.

$ mv foo bar 

Der folgende Befehl verschiebt die Datei oder das Verzeichnis foo in das bestehende Unterverzeichnis subdir , sodass sich das Ergebnis unter dem Pfad subdir/foo befindet .

$ mv foo subdir 

Der folgende Befehl verschiebt die Datei oder das Verzeichnis „ foo“ in das Unterverzeichnis „subdir“ mit dem Namen „bar“ , sodass der resultierende Pfad „ subdir/bar“ lautet . Dabei wird vorausgesetzt, dass „subdir/bar“ zuvor noch nicht existiert.

$ mv foo subdir/bar 

Im Folgenden werden zwei Dateien/Verzeichnisse, foo und bar , in das bestehende Verzeichnis subdir verschoben .

$ mv foo bar subdir 

Kopieren Sie die Datei be.03 in das Verzeichnis „bes“ des eingebundenen Volumes „bkup“ . Anschließend wird be.03 entfernt. In diesem Beispiel bezeichnet „/mnt“ das Verzeichnis (den „Mountpunkt“), in dem ein Dateisystem eingebunden ist.

$ mv be.03 /mnt/bkup/bes 

Gleiches gilt wie oben, nur dass jede aus be.03 verschobene Datei einzeln entfernt wird, anstatt alle gleichzeitig nach Abschluss des gesamten Kopiervorgangs zu löschen.

$ mv be.03/* /mnt/bkup/bes 

Der folgende Vorgang dauert länger als erwartet, wenn sich /var auf einem anderen Dateisystem befindet, was häufig der Fall ist, da Dateien kopiert und gelöscht werden. Die Shell erweitert das Verzeichnis ~zum Home-Verzeichnis des Benutzers und behandelt es *als Platzhalterzeichen .

$ mv /var/log/*z ~/logs 

Siehe auch

Referenzen

  1. ^ „Multics-Befehle“ . Archiviert vom Original am 16.08.2000 . Abgerufen am 03.02.2026 .
  2. ^mv(1)  –  FreeBSD- Handbuch für allgemeine Befehle
  3. ^mv : Dateien verschieben – Shell- und Dienstprogrammreferenz, Die einheitliche UNIX-Spezifikation , Version 5 von The Open Group
  4. ^ a bmv(1)  –  Linux General Commands Manual von ManKier.com
  5. ^ „Native Win32-Portierungen einiger GNU-Dienstprogramme“ . unxutils.sourceforge.net . Archiviert vom Original am 09.02.2006 . Abgerufen am 03.02.2026 .
  6. ^ IBM . „IBM System i Version 7.2 Programming Qshell“ (PDF) . IBM . Archiviert (PDF) vom Original am 18.09.2020 . Abgerufen am 05.09.2020 .
  7. ^ Einzelne Unix-Spezifikation #1980er: Motivation