Mehrere Dateien umbenennen mit Bash und Vim

Folgendes Problem: Viele, viele Dateien sollen umbenannt werden. Richtig praktisch für eine solche Aufgabe fand ich bisher nur das Programm Bulk-Renamer, welches Bestandteil des Dateimanagers Thunar ist. Sucht man im Internet weiter, findet man schnell weitere grafische Lösungsmöglichkeiten unter Linux.

Ich möchte die Anzahl solcher Zubehörprogramme möglichst klein halten und unabhängig von Desktopumgebungen oder Programmbibliotheken sein. Gerade ein solches Problem ruft förmlich nach einer schnellen, nicht-grafischen Lösung: Der Shell

Bei Debian und Ubuntu kann man standardmäßig auf die Bash zurückgreifen. Einen möglichen Ansatz zum mehrfachen Umbenennen von Dateien bietet eine Schleifenkonstruktion, die ich schon einmal in Zusammenhang mit dem massenhaften Umwandeln von Bild- und Videodateien in freie Formate vorgestellt habe.

#!/bin/bash

counter=123

for i in *.jpg; do
    mv -i "$i" "Sommer_Urlaub_$counter".jpg
    let counter+=1
done

Dieses kleine Skript muss nur noch abgespeichert und mit chmod+x ausführbar gemacht und in dem betreffenden Bilderverzeichnis ausgeführt werden. Dabei werden alle *.jpg Dateien der Reihe nach mit dem GNU Kommando mv in Sommer_Urlaub_123.jpg usw. umbenannt, wobei der Zähler bei 123 anfängt und dann am Ende der Schleife jeweils um 1 hochgezählt wird.

VIM – VI improved

Zuerst denkt man, wie kann ein Texteditor wie vim schon großartig beim Umbenennen von Dateien helfen? Ich muss zugeben, im Laufe der Zeit hat mich vim immer mehr begeistert und nachdem ich mir schon das Buch Vim 7 – Ge-Packt von Reinhard Wobst gekauft habe, stöbere ich auch ab und zu im Vim Wiki herum.

Gerade zum Thema „Mehrere Dateien umbenennen“ gibt es schon einen englischen Eintrag namens Bulk rename files.

Um mehrere Dateien z.B. von Großschreibung zu Kleinschreibung zu transformieren, sendet man an vim einfach eine Liste mit allen in einem bestimmten Verzeichnis vorhandenen Dateinamen.

ls | vim -

Dadurch könnte es in Vim vielleicht so aussehen:

SOMMER_URLAUB_CIMG074.jpg
SOMMER_URLAUB_CIMG075.jpg
SOMMER_URLAUB_CIMG076.jpg
SOMMER_URLAUB_CIMG077.jpg
usw.

Um diese Dateinamen z.B alle in Kleinschreibung abzuändern, muss folgender Suche-und-Ersetze-Befehl in vims Kommandomodus eingegeben werden.

:%s/.*/mv -i "&" \L"&"/g

Ergebnis
mv -i „SOMMER_URLAUB_CIMG074.jpg“ „sommer_urlaub_cimg074.jpg“
mv -i „SOMMER_URLAUB_CIMG075.jpg“ „sommer_urlaub_cimg075.jpg“
mv -i „SOMMER_URLAUB_CIMG076.jpg“ „sommer_urlaub_cimg076.jpg“
mv -i „SOMMER_URLAUB_CIMG077.jpg“ „sommer_urlaub_cimg077.jpg“

Bisher wurden die Dateien vollkommen unberührt gelassen. Alles hat sich in Vim abgespielt. Mit der Taste „u“ kann die Aktion rückgängig und mit STRG+R das Rückgängige rückgängig gemacht werden.

Wirklich ausgeführt wird die Umbenennung erst, wenn Zeile für Zeile an die Bash als Befehl übergeben wird.

Das lässt sich durch

:w !sh

oder

:%!bash

erreichen.

Auch in Vim lässt sich ein Zähler einbauen. Der allgemeine Ansatz scheint zu sein, eine separate Funktion zu schreiben, welche wiederum eine Zahl fortlaufend erhöht. Für meinen Geschmack habe ich dadurch in dem konkreten Beispiel gegenüber der for Schleife nichts gewonnen.

Warum ich Vim als Alternative angeführt habe, ist vielmehr der Vorteil, dass man alles in Ruhe vorher betrachten und prüfen kann, bevor man die Veränderung auf seine Dateien loslässt. Außerdem bietet Vim z.B. die praktische Möglichkeit mit dem visuellen Modus nur ein paar Dateien auszuwählen und den Befehl hierauf anzuwenden.

Dazu genügt es „v“ zu drücken, mit den Cursortasten den Bereich zu selektieren, dann wieder in den Kommandomodus mit „:“ wechseln und es erscheint automatisch schon

:'<,'>

Das ergänzt zu

:'<,'> !bash

und nur der ausgewählte Teil wird auch tatsächlich ausgeführt. Richtig interessant wird es aber erst mit Regulären Ausdrücken. Wer also z.B. nur den Buchstaben U, nach dem ersten Unterstrich groß oder klein schreiben möchte oder nur bestimmte Muster ersetzen möchte, kommt an den regular expressions nicht vorbei. Natürlich ist das ein Feature jeder guten Programmier- und Skriptsprache und nicht auf Vim beschränkt, welches in Sachen Reguläre Ausdrücke sowieso einen besonderen Weg gegangen ist.

Ich denke für einen so einfachen Fall bleibe ich weiterhin bei der Bash. Auch die Alternative rename sollte man sich anschauen. Wer aber bisher dachte, dass Texteditoren nur zum Ändern von Konfigurationsdateien taugen, kennt jetzt zumindest einen Tipp mehr aus dem umfangreichen Vim Wiki und es gibt dort noch viele, viele mehr. 🙂

10 Replies to “Mehrere Dateien umbenennen mit Bash und Vim”

  1. Hallo,
    das hat gut funktioniert.
    Ich habe es genutzt, um symbolische Links zu verbessern, da ich meinen Benutzernamen vor kurzem auf „dsiw“ umgestellt hatte und alle Links nicht mehr passten.
    Also habe ich mir alle Links rausgesucht und in eine Datei geschrieben. Diese habe ich dann mit vim angepasst. Dank Block-Bearbeitung (Ctrl-V) ist das ganz komfortabel.
    Als ich alle Befehle mit den Dateien verknüpft hatte, führte ich „:%!bash“ aus… erledigt.
    Gruß DSIW

  2. Hallo
    Das ist echt witzig, denn gerade habe ich an deinen alten Kommentar zu vils gedacht und bin in diesem Moment dabei ein paar Zeilen zu schreiben. Vielleicht gefällt dir vils danach auch. Freut mich aber, dass diese Lösung hier auch funktioniert hat.

  3. Ich bin mal wieder begeistert, dass ich hier (wie schon so oft) eine Lösung für eine sich ergebende Aufgabe gefunden habe – auf die Idee mit der Schleife wäre ich nämlich frühestens in 2 Stunden von allein gekommen (bilde ich mir zumindest ein…). Die vim-Methode passt für mein derzeitiges Problem nicht, aber ich bin schonmal beruhigt zu wissen, wo ich bei Zeiten nachlesen kann.
    Danke!

  4. Im Kapitel „VIM – VI improved“, müsste die Kommandozeile wie folgt heißen:

    :%s/.*/mv -i „&“ \L“&“/g

    und nicht:

    :%s/.*/mv -i „&“ L“&“/g

    es fehlte der „\“ vor dem „L“. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses Akismet to reduce spam. Learn how your comment data is processed.