Eine Datei in ein anderes Verzeichnis verschieben, einen Projektordner neu benennen oder einen Link unter einem verständlicheren Namen ablegen: Für all diese Aufgaben ist unter Linux `mv` zuständig.
Der Zusammenhang ist einfach: Beim **Umbenennen** ändert sich der Name, beim Verschieben der Ablageort – und beides lässt sich in einem einzigen Aufruf kombinieren. Anders als beim Kopieren bleibt der Eintrag anschließend nicht zusätzlich am ursprünglichen Pfad bestehen.
Das Grundprinzip von `mv`
-------------------------
`mv` steht für „move“. Die grundlegende Schreibweise lautet:
```
mv QUELLE ZIEL
```
Was dabei passiert, hängt vom Ziel ab:
- Existiert das Ziel als Verzeichnis, wird die Quelle hineinverschoben.
- Existiert der Zielname noch nicht, erhält die Quelle diesen neuen Pfad beziehungsweise Namen.
- Existiert bereits eine passende Zieldatei, kann sie überschrieben werden.
Genau deshalb solltest du vor einem Aufruf wissen, ob das Ziel bereits vorhanden ist.
Dateien umbenennen
------------------
Eine Datei benennst du um, indem du ihren bisherigen und ihren gewünschten Namen angibst:
```
mv notizen.txt linux-notizen.txt
```
Danach ist die Datei unter `linux-notizen.txt` erreichbar. Der bisherige Name `notizen.txt` entfällt.
Dateinamen mit Leerzeichen gehören in Anführungszeichen:
```
mv "alte notizen.txt" "Linux Grundlagen.txt"
```
Auch absolute Pfade sind möglich:
```
mv ~/Dokumente/entwurf.txt ~/Dokumente/beitrag.txt
```
Solange Quelle und Ziel im selben Verzeichnis liegen, änderst du damit nur den Namen.
### Eine andere Endung verändert nicht das Dateiformat
Dieser Befehl ändert lediglich den Dateinamen:
```
mv bericht.txt bericht.csv
```
Er wandelt den Inhalt nicht automatisch in ein anderes Format um. `mv` verschiebt oder benennt Dateien um; es konvertiert sie nicht.
Dateien verschieben
-------------------
Um eine Datei in ein anderes Verzeichnis zu verschieben, gibst du dieses als Ziel an:
```
mkdir -p archiv
mv notizen.txt archiv/
```
Das Ergebnis:
```
archiv/
└── notizen.txt
```
Das Zielverzeichnis muss bereits existieren. `mv` erstellt keine fehlenden übergeordneten Verzeichnisse.
### Verschieben und gleichzeitig umbenennen
Du kannst im Zielpfad einen neuen Dateinamen angeben:
```
mv entwurf.txt archiv/beitrag-entwurf.txt
```
Die Datei wechselt dadurch ihren Ablageort und ihren Namen.
### Mehrere Dateien gemeinsam verschieben
```
mv notizen.txt aufgaben.txt termine.txt archiv/
```
Bei mehreren Quellen muss das letzte Argument ein vorhandenes Zielverzeichnis sein. Die Dateien behalten darin ihre bisherigen Namen.
Vorhandene Zieldateien bewusst behandeln
----------------------------------------
Ein wichtiger Unterschied zwischen „neu ablegen“ und „ersetzen“ ist im Befehl nicht unbedingt sichtbar:
```
mv entwurf.txt beitrag.txt
```
Existiert `beitrag.txt` bereits als reguläre Datei, kann deren bisheriger Inhalt durch die Quelldatei ersetzt werden. Verlasse dich nicht darauf, dass `mv` grundsätzlich nachfragt.
### Vor dem Überschreiben nachfragen: `-i`
```
mv -i entwurf.txt beitrag.txt
```
Mit `-i` verlangt `mv` eine Bestätigung, bevor eine vorhandene Zieldatei überschrieben wird.
### Ausgeführte Aktionen anzeigen: `-v`
```
mv -v entwurf.txt beitrag.txt
```
Die ausführliche Ausgabe hilft dir nachzuvollziehen, was ausgeführt wurde. Sie ist jedoch keine Vorschau.
Für die manuelle Arbeit lassen sich beide Optionen gut kombinieren:
```
mv -iv entwurf.txt beitrag.txt
```
So siehst du die Aktion und erhältst bei einer vorhandenen Zieldatei eine Rückfrage.
### Die bisherige Zieldatei sichern
`mv` kann vor dem Ersetzen eine nummerierte Sicherung der vorhandenen Zieldatei anlegen:
```
mv --backup=numbered entwurf.txt beitrag.txt
```
Wenn `beitrag.txt` bereits existiert, wird deren bisherige Fassung beispielsweise unter diesem Namen gesichert:
```
beitrag.txt.~1~
```
Der neue Inhalt liegt anschließend unter `beitrag.txt`. Diese Funktion schützt die bisherige Zieldatei – nicht vor jeder möglichen Fehlentscheidung beim Verschieben.
Verzeichnisse verschieben und umbenennen
----------------------------------------
Für Verzeichnisse verwendest du ebenfalls `mv`:
```
mv projekt projekt-alt
```
Existiert `projekt-alt` noch nicht, erhält das Verzeichnis den neuen Namen. Seine enthaltenen Dateien und Unterverzeichnisse bleiben Teil dieser Struktur.
Anders als bei `<a href="https://andreas-moor.de/dateien-verzeichnisse-und-links-unter-linux-kopieren/">cp</a>` oder `<a href="https://andreas-moor.de/dateien-verzeichnisse-und-links-unter-linux-loeschen/">rm</a>` ist dafür kein `-r` erforderlich. `mv` verarbeitet Verzeichnisse ohne zusätzliche Rekursionsoption.
### Ein Verzeichnis in ein anderes verschieben
```
mkdir -p archiv
mv projekt archiv/
```
Danach liegt das Projekt unter:
```
archiv/projekt/
```
### Achtung: Ein vorhandenes Zielverzeichnis ändert die Bedeutung
Dieser Aufruf:
```
mv projekt projekt-alt
```
hat zwei mögliche Bedeutungen:
| Ausgangslage | Ergebnis |
|---|---|
| `projekt-alt` existiert nicht | `projekt` wird in `projekt-alt` umbenannt |
| `projekt-alt` existiert als Verzeichnis | `projekt` wird nach `projekt-alt/projekt` verschoben |
`mv` führt dabei keine allgemeine Zusammenführung zweier gefüllter Verzeichnisbäume durch.
### Den Zielpfad mit `-T` ausdrücklich festlegen
`mv` bietet dafür die Option `-T`:
```
mv -iT projekt projekt-alt
```
Damit wird das letzte Argument nicht als übergeordnetes Zielverzeichnis behandelt. Der gewünschte Zielpfad ist genau `projekt-alt`; ein unerwartetes `projekt-alt/projekt` entsteht nicht.
`-T` ist allerdings kein allgemeiner Überschreibschutz. Ob ein vorhandenes Ziel ersetzt werden kann, hängt weiterhin von dessen Typ, Inhalt und den weiteren Optionen ab.
Symbolische Links verschieben und umbenennen
--------------------------------------------
Wenn du einen symbolischen Link mit `mv` umbenennst, wird der Link selbst bearbeitet – nicht die Datei oder das Verzeichnis, auf das er zeigt:
```
mv notizen-link neuer-notizen-link
```
Auch beim Verschieben bleibt das gespeicherte Linkziel grundsätzlich unverändert:
```
mv notizen-link links/
```
Das kann bei relativen Zielpfaden entscheidend sein.
### Relative Links können nach dem Verschieben ins Leere zeigen
Angenommen, diese Struktur besteht:
```
projekt/
├── daten/
│ └── notizen.txt
├── links/
│ └── notizen-link -> ../daten/notizen.txt
└── archiv/
└── links/
```
Der Link funktioniert, weil sein Zielpfad relativ zu `projekt/links` ausgewertet wird.
Verschiebst du ihn nun:
```
mv projekt/links/notizen-link projekt/archiv/links/
```
bleibt der gespeicherte Verweis erhalten:
```
../daten/notizen.txt
```
Vom neuen Standort aus würde dieser Pfad aber nach `projekt/archiv/daten/notizen.txt` führen. Das ist nicht mehr das ursprüngliche Ziel.
Der entscheidende Punkt: `mv` berechnet relative Linkziele nicht automatisch neu. Prüfe nach einer solchen Änderung den Link und seine Erreichbarkeit.
```
ls -l projekt/archiv/links/notizen-link
readlink projekt/archiv/links/notizen-link
```
### Auch das Verschieben des Ziels kann Links beschädigen
Benennt oder verschiebt man die Zieldatei, folgen symbolische Links dieser Änderung nicht automatisch. Sie enthalten einen Pfad, keine dauerhaft mitwandernde Verbindung zur Datei.
Wenn du dagegen einen gesamten Verzeichnisbaum verschiebst und die internen relativen Beziehungen erhalten bleiben, können die darin liegenden relativen Links weiterhin funktionieren.
### Bei Links keinen Schrägstrich an die Quelle hängen
Wenn die Quelle ein symbolischer Link auf ein Verzeichnis sein könnte, verwende dessen Namen ohne abschließendes `/`:
```
mv ordner-link neuer-linkname
```
GNU warnt ausdrücklich vor einem angehängten Schrägstrich, weil dieser die Behandlung des Quellpfads beeinflusst und je nach System zu Fehlern oder unerwartetem Verhalten führen kann.
Harte Links: Ein Name ändert sich, die Datei bleibt dieselbe
------------------------------------------------------------
Ein harter Link ist ein zusätzlicher Name für dieselbe Datei. Benennst du einen dieser Namen innerhalb desselben Dateisystems um, bleiben die anderen Namen davon unberührt.
Beispiel:
```
echo 'Meine Notiz' > original.txt
ln original.txt weiterer-name.txt
mv original.txt umbenannt.txt
```
Danach existieren:
```
umbenannt.txt
weiterer-name.txt
```
Beide Namen verweisen weiterhin auf dieselbe Datei.
Das kannst du anhand der Inode-Nummern prüfen:
```
ls -li umbenannt.txt weiterer-name.txt
```
Beim Verschieben auf ein anderes Dateisystem gilt diese Beziehung nicht automatisch weiter: Dort muss eine neue Datei entstehen, die nicht denselben Inode wie die zurückbleibenden Namen besitzen kann.
Was passiert beim Wechsel des Dateisystems?
-------------------------------------------
Innerhalb desselben Dateisystems kann `mv` normalerweise den Namen beziehungsweise die Zuordnung im Verzeichnisbaum ändern, ohne sämtliche Dateiinhalte neu zu kopieren. Deshalb kann auch das Verschieben eines großen Verzeichnisses sehr schnell sein.
Beim Wechsel auf ein anderes Dateisystem funktioniert dieses einfache Umbenennen nicht. `mv` kopiert dann sinngemäß wie `cp -a` und entfernt die Quelle nach erfolgreicher Kopie.
Das hat praktische Folgen:
- Große Datenmengen benötigen Zeit und freien Platz am Ziel.
- Die Übernahme von Attributen hängt auch vom Zieldateisystem und den Berechtigungen ab.
- Ein Verschieben über Dateisystemgrenzen ist keine einzelne atomare Umbenennung.
Gerade bei wichtigen Daten lohnt es sich deshalb, das Ergebnis am Ziel anschließend zu kontrollieren.
Viele Dateien nach einem Muster umbenennen
------------------------------------------
`mv` benennt eine Quelle auf einen Zielnamen um. Für viele gleichartige Änderungen kannst du eine Shell-Schleife verwenden.
### Beispiel: `.txt` in `.md` umbenennen
Zunächst nur die geplanten Namen anzeigen:
```
for datei in ./*.txt; do
[ -f "$datei" ] || continue
printf '%s -> %sn' "$datei" "${datei%.txt}.md"
done
```
Die Erweiterung `${datei%.txt}` entfernt die passende Endung `.txt` aus dem Variablenwert. Anschließend wird `.md` angehängt. Die Schleife berücksichtigt hier reguläre Dateien sowie Links, deren Ziel eine reguläre Datei ist.
Nach der Prüfung kannst du dieselbe Auswahl umbenennen:
```
for datei in ./*.txt; do
[ -f "$datei" ] || continue
mv -iv -- "$datei" "${datei%.txt}.md"
done
```
Die Anführungszeichen schützen Dateinamen mit Leerzeichen. `--` beendet die Optionsauswertung, und `-i` fragt vor dem Überschreiben vorhandener Zieldateien nach.
Auch hier ändert sich nur der Name – aus einem Text wird nicht automatisch ein inhaltlich formatiertes Markdown-Dokument.
### Alternative: `rename`
Für größere Umbenennungsaktionen gibt es Programme namens `rename`. Allerdings existieren unterschiedliche Implementierungen mit unterschiedlicher Syntax. Prüfe deshalb zuerst:
```
rename --help
```
Bei der Variante aus util-linux lässt sich beispielsweise folgende Vorschau ausführen:
```
rename -nv .jpeg .jpg ./*.jpeg
```
Nach der Kontrolle:
```
rename -vo .jpeg .jpg ./*.jpeg
```
Hier bedeutet `-n` „keine Änderungen“, `-v` zeigt die Aktio`<a href="https://andreas-moor.de/dateien-verzeichnisse-und-links-unter-linux-loeschen/">rm</a>`nen und `-o` verhindert das Überschreiben vorhandener Dateien. Diese Syntax gehört ausdrücklich zur util-linux-Variante. Sie ersetzt das erste Vorkommen des angegebenen Textes im Namen, nicht grundsätzlich nur eine Dateiendung.
Fazit: Zielpfade und Links bewusst behandeln
--------------------------------------------
Für das Verschieben und Umbenennen reicht meist ein Werkzeug: `mv`. Wichtig sind vor allem der Zustand des Ziels und der Umgang mit vorhandenen Dateien. `-i` ergänzt Rückfragen, `-v` macht Aktionen sichtbar und `-T` legt bei `mv` die Interpretation des Zielpfads ausdrücklich fest.
Bei Links kommt eine weitere Frage hinzu: Ändert sich nur ein Name, oder verändert sich die Beziehung zwischen Link und Ziel? Wer das vorab prüft, kann Dateien und Verzeichnisse neu organisieren, ohne dabei unbemerkt Verweise zu beschädigen.
Dateien, Verzeichnisse und Links unter Linux verschieben und umbenennen
Submitted 20 hours ago by
blog@andreas-moor.de to random@mbin.linuxnation.social
https://andreas-moor.de/?p=77691