Shell-Skript: Umlaute in Dateinamen umbenennen

W

Wodnik

Mitglied
Thread Starter
Dabei seit
18.01.2009
Beiträge
38
Reaktionspunkte
12
Hallo!

Ich hoffe ich stelle die Frage hier im richtigen Unterforum...

Ich hab folgendes Problem: ich will alle Umlaute aus den Dateinamen entfernen. Dazu hab ich mir folgende Dateien zum Testen angelegt:

Code:
Test gross Ä.txt
Test gross Ö.txt
Test gross Ü.txt
Test klein ä.txt
Test klein ö.txt
Test klein ü.txt
Test ß.txt

und folgendes Skript geschrieben:

Code:
for i in *.txt
do
	x=$(echo $i | sed 's/Ä/Ae/g' | sed 's/Ö/Oe/g' | sed 's/Ü/Ue/g' | sed 's/ä/ae/g' | sed 's/ö/oe/g' | sed 's/ü/ue/g' | sed 's/ß/ss/g')
	
        mv $i $x

done

Das Ergebnis nachdem ich das Skript ausgeführt habe ist:

Code:
Test gross Ä.txt
Test gross Ö.txt
Test gross Ü.txt
Test klein ä.txt
Test klein ö.txt
Test klein ü.txt
Test [B]ss[/B].txt

Es wird also nur das ß umgewandelt. Alle Umlaute bleiben, wie sie waren.

Was mach ich falsch???
 
Laß Dir das Skript mal mit less anzeigen. Vielleicht falsches Encoding der Umlaute?

Oder schau, ob ein Skript mit dem Befehl ls *Ä* macht, was Du Dir erwartest.

EDIT: Falsch, ich hab den Fehler. Die Leerzeichen im Dateinamen sind das Problem. Probier mal

mv "$i" "$x"
 
Hallo Dalgliesh!

Vielen Dank für Deine schnelle Antwort!

Das Skript scheint in Ordnung zu sein. Jedoch bringt mir ein "ls *Ä*" kein Ergebnis - ein "ls *ß*" hingegen schon!

Scheinbar ist also ein "Ä" kein korrektes Zeichen, ein "ß" hingegen schon. Wie kann ich damit umgehen? Das Terminal ist auf Unicode (UTF-8) eingestellt.
 
Keine Ahnung, leider.
 
Was sagen
Code:
echo $LANG
echo $LC_CTYPE
echo $LC_ALL

Welche Shell verwendest Du?
 
Zuletzt bearbeitet:
Hallo maceis!

Hab ich so wie von Dir beschrieben gemacht. Leider liefert "ls *Ä*" noch immer nichts.
 
Dann kommen die Bash/Terminal wohl mit Umlauten (= multibyte characters) im Dateinamen nur bedingt klar.

Hab ein wenig rumprobiert.
Nicht nur in Verbindung mit Wildcards sondern auch mit der Tab-Vervollständigung gibt es Probleme. Ich selbst verwende die Z Shell. Da ist es auch nicht besser.

Für Dein "eigentliches" Problem ist das aber doch nicht relevant, oder:
Code:
echo Lösung | sed 's/ö/oe/'
Loesung
 
Zuletzt bearbeitet:
Ich habe es 2x probiert: unter CentOS 5.4 und unter OS X - unter CentOS funktioniert es, unter OS X nicht, s.u.

Vielleicht gibt es einen Zusammenhang damit, daß Spotlight Dateien mit Umlauten nicht findet, siehe Spotlight findet keine Umlaute in Dateien, die mit vi oder echo erstellt werden .

CentOS:
Code:
[ds@hannibal-dev test]$ touch "Test gross Ä.txt" "Test gross Ö.txt" "Test gross Ü.txt" "Test klein ä.txt" "Test klein ö.txt" "Test klein ü.txt" "Test ß.txt"
[ds@hannibal-dev test]$ ls
t1.sh  Test gross Ä.txt  Test gross Ö.txt  Test gross Ü.txt  Test klein ä.txt  Test klein ö.txt  Test klein ü.txt  Test ß.txt  t.sh
[ds@hannibal-dev test]$ cat t1.sh
#!/bin/bash
for i in *.txt
do
  echo "$i" | sed 's/Ä/Ae/g' | sed 's/Ö/Oe/g' | sed 's/Ü/Ue/g' | sed 's/ä/ae/g' | sed 's/ö/oe/g' | sed 's/ü/ue/g' | sed 's/ß/ss/g'
  x=$(echo "$i" | sed 's/Ä/Ae/g' | sed 's/Ö/Oe/g' | sed 's/Ü/Ue/g' | sed 's/ä/ae/g' | sed 's/ö/oe/g' | sed 's/ü/ue/g' | sed 's/ß/ss/g')
  echo $x
  mv "$i" "$x"
done
[ds@hannibal-dev test]$ ./t1.sh
Test gross Ae.txt
Test gross Ae.txt
Test gross Oe.txt
Test gross Oe.txt
Test gross Ue.txt
Test gross Ue.txt
Test klein ae.txt
Test klein ae.txt
Test klein oe.txt
Test klein oe.txt
Test klein ue.txt
Test klein ue.txt
Test ss.txt
Test ss.txt
[ds@hannibal-dev test]$ ls
t1.sh  Test gross Ae.txt  Test gross Oe.txt  Test gross Ue.txt  Test klein ae.txt  Test klein oe.txt  Test klein ue.txt  Test ss.txt  t.sh
[ds@hannibal-dev test]$

OS X:
Code:
[ds@hannibal test2]$ touch "Test gross Ä.txt" "Test gross Ö.txt" "Test gross Ü.txt" "Test klein ä.txt" "Test klein ö.txt" "Test klein ü.txt" "Test ß.txt"
[ds@hannibal test2]$ ls
Test gross Ä.txt	Test klein ä.txt	Test ß.txt
Test gross Ö.txt	Test klein ö.txt	t1.sh
Test gross Ü.txt	Test klein ü.txt
[ds@hannibal test2]$ cat t1.sh
#!/bin/bash
for i in *.txt
do
  echo "$i" | sed 's/Ä/Ae/g' | sed 's/Ö/Oe/g' | sed 's/Ü/Ue/g' | sed 's/ä/ae/g' | sed 's/ö/oe/g' | sed 's/ü/ue/g' | sed 's/ß/ss/g'
  x=$(echo "$i" | sed 's/Ä/Ae/g' | sed 's/Ö/Oe/g' | sed 's/Ü/Ue/g' | sed 's/ä/ae/g' | sed 's/ö/oe/g' | sed 's/ü/ue/g' | sed 's/ß/ss/g')
  echo $x
  mv "$i" "$x"
done
[ds@hannibal test2]$ ./t1.sh 
Test gross Ä.txt
Test gross Ä.txt
Test gross Ö.txt
Test gross Ö.txt
Test gross Ü.txt
Test gross Ü.txt
Test klein ä.txt
Test klein ä.txt
Test klein ö.txt
Test klein ö.txt
Test klein ü.txt
Test klein ü.txt
Test ss.txt
Test ss.txt
[ds@hannibal test2]$ ls
Test gross Ä.txt	Test klein ä.txt	Test ss.txt
Test gross Ö.txt	Test klein ö.txt	t1.sh
Test gross Ü.txt	Test klein ü.txt
[ds@hannibal test2]$
 
Das liegt daran, dass multibyte characters auf unterschiedliche Weise kodiert bzw. interpretiert werden können. Schau mal:
Code:
% ls -l
total 0
-rw-r--r--  1 martin  staff  0  6 Jan 13:35 Lösung

% echo L* | od -c
0000000    L   o   ̈  **   s   u   n   g  \n                            
0000011

% echo Lösung | od -c
0000000    L   ö  **   s   u   n   g  \n                                
0000010

merkst Du was?
Ich wette, unter CentOS fällt das Ergebnis anders aus.

Frag mich jetzt bitte nicht nach einer Lösung unter Mac OS X?
Ich hab keine.
Da spielen leider eine ganze Reihe von Faktoren eine Rolle und der ganze Themenkomplex ist offensichtlich wenig diskutiert (vermutlich, weil sich nicht so besonders viele Leute dafür interessieren).

Gruß
maceis
 
Zuletzt bearbeitet:
Danke, maceis, da merke ich doch was: Das war der entscheidende Hinweis -
ein Umlaut wie z.B. ö kann in UTF-8 sowohl als "c3 b6" oder als buchstabe o mit Diäresis "6f cc 88" dargestellt werden.

Beide Darstellungen sind gleichwertig.

Unter CentOS funktioniert das obige Script, da dort die Umlaute in den Dateinamen und im Script in der zwei-Byte-Darstellung codiert sind.

Unter OS X werden Umlaute in Dateinamen mit Diäresis gespeichert, die Umlaute im obigen Script sind in der zwei-Byte-Darstellung codiert, und sed sieht beide Codierungen nicht als gleichwertig an.
 
So weit, so gut (oder besser so schlecht).

Unklar ist mir nur, warum 'touch Lösung' (und sogar touch `echo Lösung`) einen Dateinamen mit einem o mit Diäresis erzeugt, während 'echo Lösung' ein ö als "c3 b6" ausgibt. Letzteres ist wohl auch die Variante, die die Shell bzw. das Terminalprogramm beim Eintippen des Buchstaben 'ö' erzeugt.

Unter diesen Umständen ist ein sinnvolle Arbeiten mit Umlauten in der Shell jedenfalls eine Qual.
 
OS X scheint mir nicht nur in der Shell mit Multibyte characters komisch umzugehen…

https://www.macuser.de/forum/f18/ext3-finder-zeichenkodierung-574141/

aber wie bringe ich ihm das bei, dass wenn ich ü auf der Tastatur eingebe anstelle von ü = U+0075 und U+0308 der Buchstabe mit ü = U+00FC geschrieben wird und dann vom Finder und der Shell auch wieder gelesen werden kann?
 
Zurück
Oben Unten