# mv — Dateien verschieben und umbenennen

> Praxis-Guide zu mv: Dateien und Verzeichnisse verschieben oder umbenennen, das Überschreiben kontrollieren, Backups anlegen und stapelweise umbenennen.

Source: https://www.jpkc.com/db/cheatsheets/files-text/mv/

<!-- PROSE:intro -->
mv verschiebt Dateien und Verzeichnisse an einen neuen Ort oder benennt sie um – innerhalb desselben Dateisystems geht das blitzschnell, weil nur der Verzeichniseintrag geändert und nichts kopiert wird. Genau deshalb solltest du aufpassen: Ohne `-i` oder `-n` überschreibt mv eine vorhandene Zieldatei kommentarlos und ohne Rückfrage – der alte Inhalt ist dann unwiederbringlich weg. Dieser Guide zeigt dir das Verschieben und Umbenennen im Alltag, wie du das Überschreiben steuerst, Backups anlegst und ganze Dateigruppen per Muster oder Schleife umbenennst.
<!-- PROSE:intro:end -->

## Grundlegendes Verschieben & Umbenennen

`mv <source> <destination>` — Verschiebt eine Datei an einen neuen Ort oder benennt sie um.

```bash
mv report.txt /archive/report.txt
```

`mv <old_name> <new_name>` — Benennt eine Datei im selben Verzeichnis um.

```bash
mv draft.md final.md
```

`mv <file1> <file2> <directory>` — Verschiebt mehrere Dateien in ein Verzeichnis.

```bash
mv index.html style.css app.js /var/www/html/
```

`mv *.txt <directory>` — Verschiebt alle Dateien, die auf ein Glob-Muster passen, in ein Verzeichnis.

```bash
mv *.log /var/log/archive/
```

`mv <source_dir> <destination_dir>` — Verschiebt ein ganzes Verzeichnis oder benennt es um.

```bash
mv ./old-project/ ./new-project/
```

## Überschreiben steuern

`mv -i <source> <destination>` — Interaktiver Modus. Fragt vor dem Überschreiben einer vorhandenen Datei nach.

```bash
mv -i new-config.yml /etc/app/config.yml
```

`mv -n <source> <destination>` — Kein Überschreiben (no clobber). Überschreibt niemals eine vorhandene Datei.

```bash
mv -n defaults.conf /etc/app/config.conf
```

`mv -f <source> <destination>` — Erzwingen. Überschreibt ohne Rückfrage (Standardverhalten).

```bash
mv -f updated.bin /usr/local/bin/app
```

`mv -u <source> <destination>` — Aktualisieren. Verschiebt nur, wenn die Quelle neuer ist als das Ziel oder das Ziel fehlt.

```bash
mv -u *.html /var/www/html/
```

`mv --update=none <source> <destination>` — Expliziter Aktualisierungsmodus: none (wie -n), all (Standard) oder older (wie -u).

```bash
mv --update=older ./assets/* /var/www/assets/
```

## Backup-Optionen

`mv -b <source> <destination>` — Legt vor dem Überschreiben ein Backup der Zieldatei an (hängt die Endung ~ an).

```bash
mv -b new.conf /etc/app/app.conf
```

`mv --backup=numbered <source> <destination>` — Legt nummerierte Backups (.~1~, .~2~ usw.) der überschriebenen Datei an.

```bash
mv --backup=numbered config.yml /etc/app/config.yml
```

`mv --backup=existing <source> <destination>` — Nummerierte Backups, falls bereits welche existieren, sonst ein einfaches ~-Backup.

```bash
mv --backup=existing data.json /var/data/data.json
```

`mv -S '<suffix>' <source> <destination>` — Verwendet eine eigene Endung für Backup-Dateien statt des Standard-~.

```bash
mv -b -S '.bak' config.yml /etc/app/config.yml
```

## Ausgabe & Zielverzeichnis

`mv -v <source> <destination>` — Ausführlicher Modus. Gibt jede Datei aus, während sie verschoben wird.

```bash
mv -v *.log /archive/logs/
```

`mv -v <old_name> <new_name>` — Umbenennen mit Bestätigungsausgabe von altem und neuem Namen.

```bash
mv -v draft-v1.md release-notes.md
```

`mv -t <directory> <file1> <file2>` — Gibt das Zielverzeichnis zuerst an. Nützlich mit xargs und find.

```bash
find . -name '*.bak' -print0 | xargs -0 mv -t /tmp/backups/
```

`mv -T <source> <destination>` — Behandelt das Ziel als normale Datei, nicht als Verzeichnis. Schlägt fehl, wenn das Ziel ein Verzeichnis ist.

```bash
mv -T old-dir/ new-dir/
```

## Muster für Stapel-Umbenennung

`for f in *.txt; do mv "$f" "${f%.txt}.md"; done` — Benennt alle .txt-Dateien in .md um, indem die Endung geändert wird.

```bash
for f in *.txt; do mv "$f" "${f%.txt}.md"; done
```

`for f in *; do mv "$f" "$(echo $f | tr 'A-Z' 'a-z')"; done` — Benennt alle Dateien im aktuellen Verzeichnis in Kleinbuchstaben um.

```bash
for f in *; do mv "$f" "$(echo $f | tr 'A-Z' 'a-z')"; done
```

`for f in *\ *; do mv "$f" "${f// /_}"; done` — Ersetzt Leerzeichen in allen Dateinamen durch Unterstriche.

```bash
for f in *\ *; do mv "$f" "${f// /_}"; done
```

`for f in *.jpg; do mv "$f" "photo_$(printf '%03d' $i).jpg"; ((i++)); done` — Nummeriert alle JPG-Dateien fortlaufend mit führenden Nullen.

```bash
i=1; for f in *.jpg; do mv "$f" "photo_$(printf '%03d' $i).jpg"; ((i++)); done
```

`rename 's/<pattern>/<replacement>/' <files>` — Perl-Werkzeug rename. Benennt Dateien stapelweise per Regex um (nicht auf allen Systemen verfügbar).

```bash
rename 's/\.jpeg$/.jpg/' *.jpeg
```

`rename 's/^/prefix_/' <files>` — Stellt allen passenden Dateinamen ein Präfix voran (Perl-rename).

```bash
rename 's/^/2024_/' *.log
```

`rename 'y/A-Z/a-z/' <files>` — Wandelt Dateinamen per Perl-rename von Groß- in Kleinbuchstaben um.

```bash
rename 'y/A-Z/a-z/' *.TXT
```

## Häufige Muster

`mv <file> <file>.bak` — Schnelles Backup, indem .bak an den Dateinamen angehängt wird.

```bash
mv config.yml config.yml.bak
```

`mv <file>.bak <file>` — Stellt eine Datei aus einem .bak-Backup wieder her.

```bash
mv config.yml.bak config.yml
```

`mv <file> /tmp/` — Verschiebt eine Datei nach /tmp, statt sie zu löschen (sicherer als rm).

```bash
mv unwanted-file.log /tmp/
```

`mv <dir>/{old_name,new_name}` — Benennt eine Datei per Brace-Expansion um (Shell-Kurzschreibweise).

```bash
mv /etc/app/{config.yml.old,config.yml}
```

`find <dir> -name '<pattern>' -exec mv {} <dest>/ \;` — Findet Dateien per Muster und verschiebt sie in ein Zielverzeichnis.

```bash
find ./downloads/ -name '*.pdf' -exec mv {} ./documents/ \;
```

`find <dir> -name '<pattern>' -print0 | xargs -0 mv -t <dest>/` — Findet und verschiebt Dateien sicher (auch bei Leerzeichen im Namen).

```bash
find . -name '*.tmp' -print0 | xargs -0 mv -t /tmp/cleanup/
```

`find <dir> -maxdepth 1 -mtime +<days> -exec mv {} <archive>/ \;` — Verschiebt Dateien, die älter als N Tage sind, in ein Archivverzeichnis.

```bash
find ./logs/ -maxdepth 1 -mtime +30 -exec mv {} ./archive/logs/ \;
```

<!-- PROSE:outro -->
## Fazit

mv gehört zu den am häufigsten genutzten Kommandos überhaupt: ein Werkzeug für Verschieben und Umbenennen, im selben Dateisystem ohne spürbare Wartezeit, weil keine Daten kopiert werden. Der wichtigste Stolperstein ist das stille Überschreiben – gewöhne dir bei wichtigen Zielen `-i` (Rückfrage) oder `-n` (kein Überschreiben) an, oder lass mit `-b` automatisch ein Backup anlegen. Fürs Umbenennen vieler Dateien auf einmal sind Shell-Schleifen und das Perl-Werkzeug `rename` deine Freunde; über Dateisystemgrenzen hinweg kopiert mv die Daten dagegen tatsächlich und ist dann nicht mehr augenblicklich.

## Weiterführende Links

- [ubuntuusers-Wiki: grundlegende Kommandos](https://wiki.ubuntuusers.de/grundlegende_Kommandos/) – deutschsprachige Übersicht der wichtigsten Shell-Befehle inklusive mv
- [GNU coreutils: mv invocation](https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.html) – offizielle Referenz aller Optionen (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [cp](https://www.jpkc.com/db/cheatsheets/files-text/cp/) – Dateien und Verzeichnisse kopieren
- [rm](https://www.jpkc.com/db/cheatsheets/files-text/rm/) – Dateien und Verzeichnisse löschen
- [rename](https://www.jpkc.com/db/cheatsheets/files-text/rename/) – Dateien stapelweise per Muster umbenennen

