[linux-l] Umbenennen mehrerer Dateien

olafBuddenhagen at gmx.net olafBuddenhagen at gmx.net
Di Dez 12 16:44:18 CET 2006


Hallo,

On Tue, Dec 12, 2006 at 09:34:44AM +0100, Sven Guckes wrote:
> * Olaf Buddenhagen <olafBuddenhagen at gmx.net> [2006-12-12 08:15]:

> >    for i in *; do mv "$i" "`echo $i|sed 's/./\l&/g;y/ /_/'`"; done
> 
> dabei wird jedes zeichen *einzeln* mit lowercase behandelt. ich meine
> das ginge schneller indem man den gesamten string mit einer einzelnen
> anweisung durch die lowercase funktion gibt,

Stimmt, s/.*/\L&/ statt s/./\l&/g ist vermutlich effizienter...

Nicht dass es in diesem Fall eine Rolle spielen würde -- die meisten
Systeme erlauben eh keine Megabyte-langen Dateinamen ;-)

> gab es da nicht was bei der parameter substitution der bash? dann
> braeuchte man "sed" gar nicht erst aufzurufen, oder?

Da gibt's bestimmt was... Interessiert mich aber nicht. Das war genau
mein Punkt im anderen Teilthread: Wozu irgend eine obskure
Substitutions-Syntax lernen, wenn ich auch einfach das Standard-Tool sed
nehmen kann, was ich schon kenne und auch für andere Sachen benutze?...

Das Einzige, was mich bisher daran gestört hat, war die etwas
umständliche Konstruktion mit echo. Nachdem ich gerade das mit <<< $i
gelernt habe, besteht dieses Problem auch nicht mehr :-)

Also hier die nochmals verbesserte Variante:

   for i in *; do mv "$i" "`sed 's/.*/\L&/;y/ /_/' <<< $i`"; done

oder

   for i in *; do mv "$i" "`tr '[:upper:] ' '[:lower:]_' <<< $i`"; done

-Olaf-



Mehr Informationen über die Mailingliste linux-l