mv = Move Befehl zurück
Punkt 1 Fragen Experten Links Orginaltexte
Allgemeine Beschreibung
Das Kommando mv (move) verschiebt Dateien und Verzeichnisse. mv wird auch zum Umbenennen von Dateien und Verzeichnissen verwendet, dabei liegen Ziel und Quelle im selben Verzeichnis.
mv -i: Vor dem Überschreiben von Zieldateien nachfragen.
Hierzu ein Beispiel:
user@linux ~/testdir/ $ ls
test1
user@linux ~/testdir/ $ mv test1 datei1
user@linux ~/testdir/ $ ls
datei1
Die Datei test1 wurde in datei1 umbenannt.
Alternativen
Alternativ arbeitet man mit dem Konqueror unter KDE
Oder man arbeitet mit dem Midnight Commander auf der Konsole
Zum Umbenennen und Kopieren gibt es auch den Befehl copy = cp
Siehe auch: ln und cp
Wieso funktioniert z.B. mv *.txt *.bak nicht?
Die Bash macht wildcard expansion selbst, und überläßt es nicht mv.
OK, ;-) wem das etwas griechisch vorkommt, hier noch mal die lange Fassung. Was passiert konkret, wenn man obigen Befehl aufruft? Unter DOS ist es Aufgabe der Programme, die Parameter zu interpretieren und entsprechend zu handeln. Unter UNIX, besonders mit der `bash', ist alles was mit der Interpretation von Dateinamen zu tun hat, Aufgabe der Shell. Das heißt, wenn man auf der Kommandozeile für Dateinamen Platzhalter wie ?, *, [..], {..}, !, ^, und was es sonst noch alles gibt, benutzt, ist bash, die erstmal nach Dateien sucht, und dann die Dateinamen statt den Platzhaltern in die Befehlszeile einsetzt. Ein Beispiel:
Es gibt in `/blubb/' drei Dateien: `abc.txt', `aaaa.txt' und `xyz.conf'.
Ich tippe cp /blubb/* /backup/blubb/. 'bash' ersetzt `/blubb/*' durch
`/blubb/abc.txt /blubb/aaaa.txt /blubb/xyz.conf'
und ruft das Programm mv so:
mv /blubb/abc.txt /blubb/aaaa.txt /blubb/xyz.conf /backup/blubb/
Prima. Funktioniert.
Aber stell dir mal vor, es gibt zwei Dateien in `/home/dilbert/' und du rufst aus `/home/jenny/' folgendes auf, um - wie unter DOS - die Dateien ins aktuelle Verzeichnis zu schieben:
mv /home/dilbert/*
bash ersetzt `/home/dilbert/*' durch `/home/dilbert/file1.txt /home/dilbert/file2.txt', und ruft mv folgendermaßen auf:
mv /home/dilbert/file1.txt /home/dilbert/file2.txt
-- und `file2.txt' wird gnadenlos von `file1.txt' überschrieben.
Hm, jetzt hab ich immer noch nicht erklärt, warum mv *.txt *.bak nicht funktioniert ;-) aber eigentlich dürfte es jetzt trotzdem klar sein, oder? Das letzte Argument bei mv muß ein Verzeichnis sein, und *.bak läßt sich (i.d.R.) nicht zu einem Verzeichnis expandieren (außer es gibt ausgerechnet eins, das so endet). Also schlägt die Suche der bash fehl, und mv kriegt *.bak unverändert übergeben, findet kein Verzeichnis das so heißt und meckert.
Sinn des ganzen ist ganz einfach: Programme wie `ls', `cp' und `mv' können extrem einfach gehalten werden. `ls' braucht eigentlich nur noch für jeden übergebenen Parameter die Dateiinfos einholen und anzeigen. Und: Die Platzhalter/Wildcards sind unter einer Shell für jedes Programm die gleichen. Programme, die von der Shell aufgerufen werden, brauchen sich darum nicht mehr zu kümmern.
Fallstricke können auch auftreten, wenn eine der Dateien mit einem Bindestrich anfängt, z.B. `-files.txt'. Dann kommt es vor, daß das vom aufgerufenen Programm als Parameter interpretiert wird (und es mit Fehlermeldungen um sich wirft... ) Dafür kennt fast jedes Programm den Parameter --, der einfach bewirkt, daß alles danach nicht mehr als Parameter interpretiert wird. Dann funktioniert auch ein mv -- -files.txt /irgend/wo/hin/.
http://www.pl-forum.de/t_shell/mv.html
siehe (mv, EasyLinux 06/2003)