Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateinamen bearbeiten



MadB
27-03-2002, 22:01
Hallo liebe Gemeinde!

Shell-Programmierung ist ja eine feine Sache. Das konnte ich schon mal feststellen.

Doch nun mal eine Frage, die ich nicht beantworten kann.
Wie müsste ein Script ausschauen, welches alle Dateien und Ordner ab einem bestimmten Verzeichnis (inklusive Unterverzeichnisse) in Kleinbuchstaben umwandelt?

Das schaffe ich noch nicht mal ansatzweise.
Und bei ein paar hundert Dateien und Unterverzeichnissen ist diese Angelegenheit per Hand doch etwas mühsam.

Vielen Dank im voraus.

mfg

Torsten

Krelian
27-03-2002, 22:04
Von Shell-Scripten versteh ich leider auch nicht viel.

Aber zufällig habe ich ein Script, das eben genau das macht, was du willst.

#!/bin/sh

usage ()
{
echo Usage: `basename $0` [-r ] file... >&2
exit 2
}

if [ $# -lt 1 ]
then
usage
fi

if [ "$1" = "-r" ]
then
recursive=1
shift
if [ $# -lt 1 ]
then
usage
fi
else
recursive=0
fi

for i in "$@"
do
new=`echo $i | tr "[:upper:]" "[:lower:]"`
if [ "$new" != "$i" ]
then
echo $i "->" $new >&2
mv "$i" "$new"
fi
if [ $recursive = 1 -a -d "$new" ]
then
$0 -r "$new"/*
fi
done

Speichere das einfach in einer Textdatei, mach diese mit chmod +x "dateiname" ausführbar und führ das Script mit ./dateiname -r * aus.

MadB
27-03-2002, 22:08
Moinsen!

Ist ja unglaublich. Das ging aber schnell.
Besten Dank dafür.

Grüße

Torsten

MadB
27-03-2002, 22:16
Moinsen!

Hui, funzt astrein.
Genau so hatte ich mir das vorgestellt.
Nochmals besten Dank.

Grüße

Torsten

Nighthawk
28-03-2002, 09:17
Original geschrieben von Krelian
if [ "$1" = "-r" ]

Ich glaub ja nicht dass das so richtig ist :p

Krelian
28-03-2002, 09:25
Ich habe das Script nicht selber geschrieben, was soll denn daran falsch sein?

Nighthawk
28-03-2002, 09:45
if [ "$1" = "-r" ] ersetzt den ersten Kommandozeilenparameter $1 durch -r. Die if-Anweisung ist überflüssig weil eine Variablenzuweisung immer true ergibt und deswegen die Anweisung immer ausgeführt wird. Richtig wäre meines Erachtens if [ "$1" == "-r" ]. Für if [ $recursive = 1 -a -d "$new" ] gilt das gleiche. Das Script läuft so wie's jetzt ist wohl immer rekursiv mit allen Parametern. Außer ich hab 'ne Eigenart von sh übersehen die es in bash nicht mehr gibt, aber das wage ich zu bezweifeln.

Krelian
28-03-2002, 09:58
Wieder was dazugelernt :D

Wenn ich jetzt noch wüsste, von wem ich dieses Script habe, würde ich ihm diese Verbesserung auch noch mitteilen...

sticky bit
28-03-2002, 16:15
@Nighthawk:
Da würd ich mal nicht soweit aus dem Fenster lehnen. Bei anderen Sprachen geb ich dir völlig Recht mit der Zuweisung wenn man "x = y" schreibt (abgesehen davon, dass man dann in BASH die Spaces die Quatas und das Dollar weg lassen müsste...) aber in BASH wenn man das macht über test und die eckigen Klammern sind nichts anderes als ein Aufruf von test anders ausgedrückt, dann werden Strings tatsächlich verglichen mit '=' als wahr ausgewertet wenn sie gleich sind und mit '!=' verglichen als wahr wenn sie ungleich sind.
Wie es sich mit anderen Shells verhält weiss ich allerdings nicht aber in BASH ist das so, hab auch blöd geschaut, weil das etwas verwirrend ist, aber es ist so: man test

Nighthawk
28-03-2002, 20:01
Bäh, das könnte sogar stimmen. Da gewöhnt man sich jahrelang ab in C++ diesen Fehler zu machen und dann sowas ;)