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. :)

6 Kommentare zu Mehrere Dateien umbenennen mit Bash und Vim

Hinterlasse eine Antwort

  

  

  

Du kannst diese HTML tags benutzen

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>