Datei-Endungen rekursiv ändern

Datum: 2004-05-13
Quelle: suse-linux

Worum ging es?

Für alle Dateien mit der Endung _s.jpg soll in einem Verzeichnisbaum die Endung auf .jpg umgesetzt werden. Es war nicht ganz klar, ob das case-insensitiv geschehen sollte, deshalb werden beide Fälle beschrieben.

Code
# nur klein geschrieben / only lowercase
find -name "*_s.jpg" -print | while read i; do
  mv -i "$i" "`dirname \"$i\"`/`basename \"$i\" _s.jpg`.jpg"
done
# alle Varianten / case insensitive
find -iname "*_s.jpg" -print | while read i; do
  mv -i "$i" "`echo \"$i\" | sed 's/_s\.jpg$/.jpg/i'`"
done
# Schreibweise der Endung behalten / keep the original suffix
find -iname "*_s.jpg" -print | while read i; do
  mv -i "$i" "`echo \"$i\" | sed 's/_[sS]\.\([jJ][pP][gG]\)$/.\1/'`"
done
Beschreibung

Die erste Schleife setzt den neuen Dateinamen aus dem Verzeichnis- und dem Namensanteil neu zusammen. Dabei wird ausgenutzt, dass basename als 2. Argument eine Endung aufnehmen kann, die dann abgeschnitten wird. Die anderen beiden Varianten suchen case-insensitiv (Option -iname) und nutzen zum Umbenennen den sed. Die dritte Version merkt sich die Originalendung (Teil nach dem Punkt) und hängt diese dann wieder an.