claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 02/2005   »   Ausgabe bestellen

mmv

Auf einen Streich

von Heike Jurzik


Mit "mv" (wie englisch "move") verschieben Sie Dateien und Verzeichnisse auf der Kommandozeile -- für aufwendigere "Verschiebe"-Aktionen benötigen Sie komplizierte Schleifenkonstruktionen einsetzen. Einfacher geht es mit "mmv".

Das Programm mmv ("multiple move") ist ein komfortabler "Umzugshelfer": Mit nur einem Befehlsaufruf benennt es mehrere Dateien gleichzeitig um und vertauscht auf Wunsch sogar Groß- und Kleinbuchstaben. Eingebaute Sicherheitsabfragen verhindern dabei, dass Sie aus Versehen Daten überschreiben.

mv mit Wildcards

Den Befehl mv haben wir schon mehrfach im Guru-Training besprochen [1,2] und Anwendungsbeispiele gezeigt. Dabei haben wir auch jeweils den Einsatz von Wildcards beschrieben, mit denen Sie mehrere Dateien gleichzeitig erwischen.

Zur Gedächtnisauffrischung: Wildcards ersetzen Teile von Zeichenketten. Ein Fragezeichen "?" lässt dabei genau einen Buchstaben unbestimmt (z. B. passt "h?llo" auf die Dateinamen hallo, hGllo, h7llo, ...), während das Sternchen "*" für beliebig viele verschiedene Zeichen steht (z. B. erfasst "G*ss" die Dateien Gss, Guss, Genuss). Um etwa alle Dateien, die auf .html enden, in ein Verzeichnis namens HTML im eigenen Home-Verzeichnis zu verschieben, verwendet man den Befehl:

mv *.html ~/HTML/

For-Schleife für alle Fälle

Komplizierter ist die Aufgabe, mehrere Dateien, die auf .htm enden, in einem Rutsch so umzubenennen, dass sie die Endung .html erhalten -- der folgende Versuch schlägt fehl:

$ mv *.htm *.html
mv: Beim Verschieben mehrerer Dateien muss das letzte Argument ein Verzeichnis sein.
»mv --help« gibt weitere Informationen.

Was geht hier schief? Die Bash interpretiert den Platzhalter, also das Sternchen, und löst *.htm zunächst in die einzelnen Dateinamen, z. B. datei1.htm, seite2.htm usw. auf. Anschließend versucht die Bash, diese Dateien in das Verzeichnis *.htm zu verschieben, das nicht existiert.

Shell-Gurus lösen dieses Problem mit einer so genannten for-Schleife, in der die Shell einen Befehl wiederholt mit unterschiedlichen Argumenten ausführt:

for i in *.htm; do mv $i `basename $i .htm`.html; done

Der kryptische Aufruf lässt sich in etwa so übersetzen: "Für alle Dateien, die auf *.htm enden, tue Folgendes: Benenne Sie so um, dass ihre Endung .htm abgeschnitten und durch .html ersetzt wird." Zunächst wird dabei jeder Dateiname mit der Endung *.htm der Variablen i zugewiesen; für diese erfolgt der mv-Aufruf mit zwei Parametern: dem ursprünglichen Dateinamen ($i) und dem neuen Namen, der aus dem "Basisnamen" (basename) ohne die Endung und einer neuen Endung .htm gebildet wird.

Das ist aber schon fortgeschrittene Shell-Nutzung -- mit dem Programm mmv können auch Shell-Einsteiger bequem komplexere Umbenennungen erledigen.

mmv installieren

Ohne for-Schleife und den Einsatz von basename benennen Sie Dateien mit mmv um. Für Fedora Core 2 und Mandrake Linux 10.1 enthalten die Installationsmedien keine RPM-Pakete, und auch die Suche im Netz blieb zunächst erfolglos. Dennoch gibt es unter [3] ein Paket, das problemlos auf beiden Systemen funktioniert.

  1. Gehen Sie beispielsweise mit dem Konqueror zur Adresse [3]. Eine Dialogbox fragt nach, ob Sie das RPM-Paket speichern oder öffnen wollen.
  2. Bestätigen Sie die Schaltfläche Mit "RpmDrake" öffnen unter Mandrake Linux 10.1 bzw. Öffnen mit und Eingabe von system-install-packages unter Fedora Core 2 und geben Sie nach dem Download das Root-Passwort ein.
  3. Nach dem Überprüfen der Abhängigkeiten spielt der Paket-Manager das Programm ein.

Unter Suse Linux 9.1 und 9.2 ist das Paket standardmäßig installiert -- sollte es dennoch auf Ihrem System fehlen, finden Sie es über YaST (K-Menü / System / YaST), indem Sie in das Suchfeld mmv eingeben. Bestätigen Sie durch Klick auf Übernehmen, um mit der Installation zu beginnen (Abbildung 1).

Abb. 1: Unter Suse Linux 9.1 und 9.2 ist "mmv" Teil der Standardinstallation.

Perfekter Umzug

Die for-Schleife aus dem vorigen Beispiel lässt sich mit mmv viel einfacher schreiben:

mmv "*.htm" "#1.html"

Zunächst erfassen Sie wieder alle Dateien, die auf .htm enden, mit der Wildcard (*). Der Ausdruck #1 im zweiten Argument wird beim Umbenennen genau durch den Teil des Dateinamens ersetzt, auf den das Sternchen passt: also etwa datei1 in datei1.htm. Achten Sie darauf, die doppelten Anführungszeichen zu verwenden, um die Bash davon abzuhalten, die beiden Sonderzeichen * und # zu interpretieren.

Kommt es bei dem Umzug zu Kollisionen, etwa weil es schon eine Datei mit gleichem Namen wie die gewünschte Zieldatei gibt, überschreibt mmv diese nicht einfach, sondern warnt:

datei1.htm -> datei1.html : delete old datei1.html? 

Als Antwort erwartet der Befehl entweder ein y für "yes" oder ein n für "no", jeweils gefolgt von der [Eingabe]-Taste.

Kisten stapeln

Wer sich mehr Informationen über die einzelnen Arbeitsschritte von mmv wünscht, setzt zusätzlich die Option -v ein:

$ mmv -v "*.htm" "#1.html"
1.htm -> 1.html : done
2.htm -> 2.html : done
3.htm -> 3.html : done
4.htm -> 4.html : done

Praktisch: Hinter das Rautenzeichen können Sie als zusätzlichen Buchstaben entweder ein u oder ein l setzen und damit die Groß- und Kleinschreibung von Dateinamen beeinflussen. Liegen in einem Verzeichnis beispielsweise eine Reihe von Dateien, deren Namen nur aus Großbuchstaben bestehen, benennen Sie diese auf einen Streich um:

$ mmv -v "*.HTM" "#l1.html"
DATEI1.HTM -> datei1.html : done
DATEI2.HTM -> datei2.html : done
DATEI3.HTM -> datei3.html : done
DATEI4.HTM -> datei4.html : done

Das l fügen Sie hinter dem Rautenzeichen, direkt vor der Nummer des Platzhalters ein. Tipp: Die Bedeutung können Sie sich gut merken, wenn Sie daran denken, dass u für "upper case" (Großbuchstaben) und l für "lower case" (Kleinbuchstaben) steht.

Gut vertauscht

Ein praktisches Feature ist das Vertauschen von Wildcards. Gibt es beispielsweise eine Reihe von Dateien mit der Endung .orig, die alle umbenannt werden sollen, so dass das "orig" am Anfang steht und eine Dateiendung .bak hinzugefügt wird, lautet der mmv-Aufruf:

$ mmv -v "*.*" "#2-#1.bak"
datei1.orig -> orig-datei1.bak : done
datei2.orig -> orig-datei2.bak : done

Die beiden Wildcards aus dem ersten Parameter werden im zweiten Teil vertauscht (#2 bezieht sich auf das Sternchen hinter dem .). Weiterhin setzen Sie in diesem Aufruf einen Bindestrich zwischen die Teile und fügen eine neue Endung .bak an. (hge)

Infos
[1] Elisabeth Bauer, "Schneller Räumen mit der Shell -- Dateien verschieben mit mv", EasyLinux 06/2003, S. 79 ff., http://www.easylinux.de/Artikel/ausgabe/2003/06/079-mv/
[2] Heike Jurzik, "Ordnung ist das halbe Leben...", EasyLinux 05/2004, S. 77 ff.
[3] mmv-Paket für Fedora und Mandrake Linux: ftp://at.rpmfind.net/linux/redhat.com/contrib/libc6/i386/mmv-1.01b-3.i386.rpm

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2021 COMPUTEC MEDIA GmbH | Last modified: 2007-04-05 11:10

[Linux-Magazin] [LinuxUser] [Linux-Community]