Geschrieben von Haui am 10.07.2009 um 23:19:
Rekursives Umbenennen
Normalerweise schreibe ich ja nichts hier ins Forum, was ich schon gebloggt hab, aber hier mach ich mal eine Ausnahme, weil es sich um ein relativ häufig auftretendes Problem handelt.
Konkret geht es um das Umbenennen von Dateien nach einem bestimmten Schema, wofür sich das kleine Perl-Script
rename schon durchaus etabliert hat. Diese Lösung hat nur ein Problem - sie funktioniert nicht rekursiv für Dateien in Unterverzeichnissen. Prinzipiell bietet sich in so einem Fall natürlich immer find mit seiner exec/execdir-Option an. Leider funktioniert diese Lösung hier nicht (warum werde ich hier nicht erläutern, aber das kann der geneigte User ja jederzeit selbst ausprobieren
).
Sicherlich gibt es auch hierfür schon andere fertige Lösungen, aber da ich von der prinzipiellen Funktionsweise von rename begeistert bin, hab ich gestern ein wenig rumgebastelt und eine
verbesserte Version von rename erstellt, die um die Möglichkeit erweitert ist, Dateien und Verzeichnisse rekursiv umzubenennen.
Also die Datei runterladen, mit Rootrechten in den PATH schieben und ausführbar machen (
mv recrename.pl /usr/local/bin/recrename && chmod 755 /usr/local/bin/recrename) und dann kann's auch schon losgehen.
Als kleines Beispiel soll hier Entfernen von Leerzeichen sowie das Ändern von Groß- in Kleinbuchstaben in Dateinamen dienen (Annahme: die Dateien, die wir umbenennen wollen, liegen in /home/user/documents/):
code: |
1:
|
recrename -rn 's#\s+#_#g;y#A-Z#a-z#' /home/user/documents |
|
In meinen Augen ziemlich kurz
- und für den ein oder anderen auf den ersten Blick evtl. auch etwas kryptisch, darum hier eine kurze Erklärung. Der Switch
-n sorgt zunächst einmal dafür, dass der obige Befehl nichts verändert, sondern nur anzeigt was das Script verändern würde, wenn man es ohne diese Option ausführt.
-r teilt dem Programm mit, dass alle Dateien und Ordner, die sich unterhalb von /home/user/documents nach dem Schema umbenannt werden sollen. Zu guter Letzt ein kurzes Wort zu den
regular expressions:
s#\s+#_#g; bedeutet hier folgendes: Ersetze jede Sequenz von 1 bis n aufeinanderfolgenden Whitespace-Zeichen durch einen Unterstrich.
y#A-Z#a-z# ersetzt - wie man vermuten wird - alle Groß- durch Kleinbuchstaben.
Prinzipiell kann man hier noch viele weitere Operationen durchführen, aber das hier genannte sollte für den Anfang genügen. Wer mehr wissen will, kann sich
hier,
hier sowie an vielen anderen Stellen im Netz weiterführenden Infos holen.