Warum funktioniert mv *.txt *.bak nicht?

Manchmal will man schnell ein paar Dateien eine neue Endung verpassen. Dabei kann man aber leicht auf die Nase fallen.

>touch text1.txt text2.txt
>mv *.txt *.bak
>ls
text2.txt

Was ist da passiert? Und wo ist text1.txt hin? Nun das Problem ist, dass Wildcards wie der Stern von der Shell und nicht von dem aufgerufenen Programm (also in unserem Fall mv) ausgewertet werden. Was macht also die Shell aus unseren Parametern?

>touch text1.txt text2.txt
>echo *.txt *.bak
text1.txt  text2.txt

*.txt wird zu text1.txt text2.txt expandiert und *.bak fällt weg, weil es keine Datei gibt die auf *.bak passt. D.h. wie haben vorhin text1.txt auf text2.txt geschoben und text2.txt dabei überschrieben. Da das mv also gar keine Chance hat, mehrere Dateien richtig umzubennen, unterstützt es nur mv datei neuername und mv datei datei ... verzeichnis. Dass wir hier nur 2 Dateien umbenennen wollten, war besonderes Pech, bei einer oder mehr als zwei Dateien hätten wir eine Fehlermeldung erhalten.

Um jetzt mehrer Dateien umzubenennen gibt es den Befehl rename von nach dateien. Dabei wird von in allen angegebenen Dateinamen durch nach ersetzt. Also z.B.

>ls
text1.txt  text2.txt
>rename .txt .bak *.txt
>ls
text1.bak  text2.bak
>rename .bak .txt.bak *.bak
>ls
text1.txt.bak  text2.txt.bak

MultipleMove (zuletzt geändert am 2007-12-23 22:48:06 durch localhost)