Umlaute script

C

chr1s

Jungspund
hallo erstmal:)

soll für die schule ein script entwickeln das folgendes leisten soll:
Entwickeln Sie ein bash-script, welches in einem anzugebenden verz nach dateinamen mit umlauten und oder leerzeichen sucht und diese dann auf benutzerrückfrage in ein verträgliches format umbenennt.

die problematik liegt bei den umlauten.
in der konsole funktioniert das find kom wunderbar
find /users/class/"$class"/"$user" -name "*ä*" > umleer.tmp
sobald ich das aber versuche zu scripten läuft es nicht mehr...

komm nicht weiter wegen den umlauten...
hier mein anfang:
Code:
#!/bin/sh
#trap....
#script zum suchen und umbenennen von dateien mit umlauten und leerzeichen

echo "|><><><   Script zum suchen nach Umlauten und Leerzeichen   ><><><|"
echo "Verzeichniss angeben(nix für $HOME):"
read verz
if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -name " " > umleer.tmp
    find /users/class/"$class"/"$user" -iname "*ä*" >> umleer.tmp
    find /users/class/"$class"/"$user" -iname "*ö*" >> umleer.tmp
    find /users/class/"$class"/"$user" -iname "*ü*" >> umleer.tmp
    cat umleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -name " " > umleer.tmp
    find "$verz" -iname "*ä*" >> umleer.tmp
    find "$verz" -iname "*ö*" >> umleer.tmp
    find "$verz" -iname "*ü*" >> umleer.tmp
    cat umleer.tmp
fi


exit 0

vielen dank im vorraus...
 
Zuletzt bearbeitet:
...
sobald ich das aber versuche zu scripten läuft es nicht mehr...
...

hilft bei der Fehlersuche nicht weiter. Kommen Fehlermeldung oder ...? Deswegen erstmal nur ne Vermutung: ändere die Shebang mal in #!/bin/bash.

Bezüglich Deines Skriptes muss ich noch folgendes anmerken: es ist nicht wirklich effizient, find 4x aufzurufen. Besser ist folgendes:

Code:
find "$verz" -iname "* *" -or -iname "*ä*" -or -iname "*ö*" -or -iname "*ü*" ...

Gruss, Xanti
 
thx

es kommt keine fehlermeldung
mit set -x kommt:

Code:
bbt?????@ux-09:~/ben/scripte/projekt> umlaute.sh
+ echo '|><><><   Script zum suchen nach Umlauten und Leerzeichen   ><><><|'
|><><><   Script zum suchen nach Umlauten und Leerzeichen   ><><><|
+ echo 'Verzeichniss angeben(nix f▒r /users/class/bbt???/bbt?????):'
Verzeichniss angeben(nix f▒r /users/class/bbt???/bbt?????):
+ read verz

+ '[' -z '' ']'
++ groups
+ class=bbt???
++ whoami
+ user=bbt?????
+ echo 'Suchen nach Dateien in /users/class/bbt???/bbt?????...'
Suchen nach Dateien in /users/class/bbt???/bbt?????...
+ find /users/class/bbt???/bbt????? -name ' '
+ find /users/class/bbt???/bbt????? -iname '*▒*'
+ find /users/class/bbt???/bbt????? -iname '*▒*'
+ find /users/class/bbt???/bbt????? -iname '*▒*'
+ cat umleer.tmp
+ exit 0

die problematik ist das die umlaute nicht erkannt werden...
 
Welchen Editor nutzt Du? Wahrscheinlich wird im falschen Zeichensatz gespeichert. Werden bei cat umlaute.sh die Umlaute richtig angezeigt?
 
benutze scite
bei cat .... kommt nix
hab ma die kodierung auf utf-8 umgestellt und was kleines zum teste3n geschrieben
Code:
#!/bin/sh
find $HOME -iname "*ä*"

, jetzt sagt der mir aber:
Code:
-bash ./test.sh: cannot execute binary file
 
Code:
+ find /users/class/bbt???/bbt????? -iname '* *' -o -iname '*�' -o -iname '*�' -o -iname '**'

der will die zeichen einfach nicht erkennen
 
Du benutzt ja noch immer die /bin/sh anstatt die /bin/bash wie von Xanti
empfohlen...wenn Du es mit der /bin/bash probiert hast und es nicht geht,
poste doch bitte deren Version.
Welches Betriebsystem/Umgebung hast Du?
 
Wieso nicht einfach:
Code:
rename 's/ä/ae/;s/ö/oe/;s/ü/ue/' *
usw. halt
 
hmm...
werd aus der man von rename nicht schlau...
kannste das ma erklaeren...?!
 
Vielleicht liegt das Problem auch an der Spracheinstellung. Gib doch in der Konsole, in der der 'find'-Befehl funktioniert, mal 'echo $LC_ALL' ein. Was kommt dabei raus?
Das Entsprechende kannst Du dann als erstes in Dein Skript mitaufnehmen mittels
'export LC_ALL="DE"' oder so
(ich benutze immer "C", daher weiss ich nicht, wie der richtige Code lauten muss).
 
Wenn Probleme mit Umlauten bestehen, wird ein rename das Problem auch nicht lösen.

Gruss, Xanti
 
Hallo
Es liegt natürlich an der Umgebungsvariable des verwendeten Zeichensatzes.
Wenn du das als script laufen lässt, ist diese unter Umständen nicht auf den gewünschten Wert gesetzt.
Beherzigst du dagegen den Vorschlag von Schlaubi_fi.de, dann garantierst du den richtigen Zeichensatz.

Desweiteren frage ich mich, wie du den Zeichensatz auf utf8 ungestellt hast.
In der Shell sicher nicht. ;)
Du kannst natürlich auch nur zeichensätze verwenden, deren Schriften vorhanden sind!

Gruß Wolfgang
 
Speicher mal das .sh (ich denke mal du benutzt ein KDE-Programm (z.B. kwrite)) mit einer anderen Codierung.

Ansonsten welchen Zeichensatz benutzt dein Bsys? Dann kannst du es ja auch irgentwie numerisch (z.B. 65=A (ASCII-Tabelle)) angeben.
 
erstmal vielen dank für die hilfe!top

hab das mit dem umlauten jetzt hinbekommne...:
hab das in utf-8 konvertiert und dann wieder in 8 bit

Code:
#!/bin/bash
#trap....
#script zum suchen und umbenennen von dateien mit umlauten und leerzeichen

echo " Script zum suchen nach Umlauten und Leerzeichen  "
echo "Verzeichniss angeben nix fuer $HOME:"
read verz

if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -iname "* *" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" > umleer.tmp
    #cat umleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -iname "* *" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" > umleer.tmp
    #cat umleer.tmp
fi

anz=`wc -l<umleer.tmp`
i=1
while [ $i -le $anz ] ; do
    zeile=`head -$i umleer.tmp | tail -1`
    echo "+"
    echo "$zeile"
    i=`expr $i + 1`
done

exit 0

funktioniert :-)
aber ist ja noch nicht fertig...
gibts nicht ne einfache möglichkeit die umlaute zu ersetzen anstelle die zeilen ausschneiden, dann den text splitten, ersetzen und wieder zusammensetzen (mit schleifen)...

(der benutzer soll je datei gefragt werden ob die datei umbenannt werden soll)

wie zb mit rename?
 
Zuletzt bearbeitet:
Hallo
Klar geht das etwas einfacher.

Du könntest z.B. ein solches Verfahren anwenden, damit hast du auch die Leerzeichenproblematik abgefangen.
Codefragment ohne Übergabeparameterprüfung und Dialog:
Code:
find $VERZ -type f|while read FILENAME;
do
if [ $(echo $FILENAME|grep -iq "äüöß") ]; then
echo "Umlaute gefunden";
#Fragedialog etc..
...
NEWNAME=$(echo $FLENAME|sed -e 's/Ä/Ae/g;s/ä/ae/g;s/ü/ue/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g;s/ß/sz/g')
mv $FILENAME $NEWNAME;
...

fi

Nur so als Denkanstoß
Mit Perl geht das noch besser. ;)
Aber das ist ja nicht relevant bei deinen Hausaufgaben.

Gruß Wolfgang
 
so...
bin so gut wie fertig...:)
Code:
#!/bin/bash
trap 'test -d umlautetmp && rm -r umlautetmp; exit 1' 2
#script zum suchen und umbenennen von dateien mit umlauten und leerzeichen
mkdir umlautetmp

echo " Script zum suchen nach Umlauten und Leerzeichen  "
echo "Verzeichniss angeben nix fuer $HOME:"
read verz

if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -iname "* *" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*"> umlautetmp/old.tmp
    #cat umleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -iname "* *" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*"> umlautetmp/old.tmp
    #cat umleer.tmp
fi
cat umlautetmp/old.tmp | sed -e 's/Ä„/Ae/g; s/ä/ae/g; s/ü/ue/g; s/Ãœ/Ue/g; s/Ã/Oe/g; s/ö/oe/g; s/ß/sz/g; s/ /_/g'>umlautetmp/new.tmp

anz=`wc -l<umlautetmp/old.tmp`
i=1
while [ $i -le $anz ] ; do
    oldzeile=`head -$i umlautetmp/old.tmp | tail -1`
    newzeile=`head -$i umlautetmp/new.tmp | tail -1`
    oldbasename=`basename "$oldzeile"`
    newbasename=`basename "$newzeile"`
    filetype=`file "$oldzeile" | cut -d: -f2`
    echo "$filetype '$oldbasename' in '$newbasename' umbenennen...?(j/n)"
    read best
    if [ "$best" = j ] ; then
        mv "$oldzeile" "$newzeile"
    fi
    i=`expr $i + 1`
done

test -d umlautetmp && rm -r umlautetmp
exit 0



#-----ERRORCODES-----
#1 -- CTRL + C abbruch

verbesserungsvorschlaege...?
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

verzeichniss suche funktioniert nicht

Queue für copy Script

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Windows clients können nicht mehr auf lange laufendes System zugreifen

Zurück
Oben