Datum: 2001-08-07
Quelle: suse-linux
Diesmal ging es darum, rekursiv Dateien umzubenennen und dabei sollten auch so perverse Konstruktionen wie Zeilenumbrüche in Dateinamen berücksichtigt werden. Mein Vorschlag war diesmal, das Teil in einen find und ein kleines Script zu splitten.
#! /bin/bash
# lc - einen Dateinamen von Gross- in Kleinbuchstaben verwandeln
# Leerzeichen in Untersriche konvertieren
# lc - rename a filename from upper to lowercase letters
# convert blanks to underscores
x="`dirname \"$*\"`/`basename \"$*\" | tr '[:upper:] ' '[:lower:]_'`"
echo -ne "$x\000"
# script end
# und mit folgendem find ist das Script aufzurufen / call the script from a find this way:
find PFAD -type f -name "*[A-Z]*" -print0 -exec lc {} \; | xargs -0 -n2 mv -i
Immer dann, wenn die berüchtigten \n in Dateinamen auftauchen, ist Stress vorprogrammiert. Die meisten Linux-Programme können
eben nicht sauber damit umgehen (ich kenne nur 2, nämlich find und xargs, bei denen das korrekt funktioniert). Deshalb gibt es
in meinem Listing auch so kranke Konstruktionen wie den echo -ne "$x\000", der den konvertierten
Dateinamen ohne abschließendes \n, dafür aber mit \0 am Ende ausgibt.
Eine weitere Falle lauert in der rekursiven Bearbeitung: Nur die Dateinamen, nicht aber die Verzeichnisanteile des Namens,
dürfen konvertiert werden. Aus diesem Grund wird durch das lc-Script nur der
basename-Anteil des Dateinamens konvertiert.