• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Konvertieren von Sonderzeichen (z.B. \326 -> Ö)

Hallo,

nach der Migration eines SuSE Standardserver 8 mit ReiserFS auf ein SuSE 10.1 stehe ich vor dem Problem, daß auf den Partitionen, auf die die User via Samba-Server Daten abgelegt haben, die Umlaute verschwunden sind. Die Daten liegen auf separaten Partitionen, darauf ist immer noch ReiserFS, während das System auf EXT3 läuft

Unter Windows erscheint statt der Umlaute ein Unterstrich, auf der Konsole erscheint statt des Umlauts ein Fragezeichen.
Die Information darüber, welches Zeichen es ursprünglich einmal war, ist noch vorhanden. Es gab zum Beispiel ein Verzeichnis mit dem Name Überlingen, welches ich auf der Konsole als ?berlingen sehe. Wenn ich aber folgendes eingebe:

server: #stat *berlingen
File: `\334berlingen'
Size: 4096 Blocks: 16 IO Block: 4096 directory
Device: 801h/2049d Inode: 1556584 Links: 19
Access: (0777/drwxrwxrwx) Uid: ( 521/ sa) Gid: ( 100/ users)
Access: 2006-10-10 09:08:09.000000000 +0200
Modify: 2006-09-19 14:26:26.000000000 +0200
Change: 2006-10-09 22:19:55.000000000 +0200

Dann sehe ich also, daß das Ü als \334 kodiert ist.

Hat einer von Euch einen Vorschlag, wie ich ggf. mit Hilfe eines Skripts die Umlaute wieder sichtbar machen kann?

Danke für jeden Tipp und Vorschlag.

Stefan
 

sc_m

Member
Das Problem dürfte wohl sein, dass die Dateien ursprünglich in ISO 8859-15 abgelegt wurden, währen das Betriebssystem inzwischen Utf-8 verwendet.

Text kann man anscheinend so umwandeln:
Code:
ada@barnabas:~> echo -e "\334berlingen" | iconv -f ISO_8859-15 -t UTF-8
Überlingen

Ich weiß allerdings nicht, wie eine Reiser-Partition mit solchen Dingen umgeht. Zumindest unter den Mount-Optionen konnte ich bei Reiser keine Zeichensatzeinstellungen finden. Du kannst ja einfach mal versuchen, mit cp eine Datei auf einen Utf-8-Namen zu kopieren.

Taucht das Problem eigentlich nur bei den Dateinamen auf oder auch beim Inhalt?
 
OP
S

smguenther

Newbie
Hi,

sc_m schrieb:
Das Problem dürfte wohl sein, dass die Dateien ursprünglich in ISO 8859-15 abgelegt wurden, währen das Betriebssystem inzwischen Utf-8 verwendet.

Text kann man anscheinend so umwandeln:
Code:
ada@barnabas:~> echo -e "\334berlingen" | iconv -f ISO_8859-15 -t UTF-8
Überlingen

Ich weiß allerdings nicht, wie eine Reiser-Partition mit solchen Dingen umgeht. Zumindest unter den Mount-Optionen konnte ich bei Reiser keine Zeichensatzeinstellungen finden. Du kannst ja einfach mal versuchen, mit cp eine Datei auf einen Utf-8-Namen zu kopieren.

Taucht das Problem eigentlich nur bei den Dateinamen auf oder auch beim Inhalt?

Zum Glück betrifft es nur die Dateinamen und nicht den Inhalt!
Im aktuellen System Umlaute zu verwenden ist kein Problem, selbst auf den ReiserFS-Partitionen. Der folgende Befehl führt zum Ziel:

mv *berlingen Überlingen

Das Problem ist nur, daß auf den Partitionen mehr als 7000 Verzeichnisse und eine noch nicht ermittelte Anzahl von Dateien liegt.
Es wäre ja schon ein erste Schritt, wenn mir find die betroffenen Dateien/Verzeichnisse liefern würde. Aber wie soll ich nach ?berlingen suchen, schließlich ist das Fragezeichen ja gar nicht das wahre Zeichen?
Und mit "Ü*" bzw. "\344*" zeigt mir find auch nichts an.

Gruß,

Stefan
 
$FTP/hxtools-20060909-0.i586.rpm
darin gibt es /usr/lib/hxtools/bin/filenameconv, mit dem du alle umdrehen kannst,
Code:
filenameconv -f iso8859-1 -t utf-8 /daten
Das zeigt dir an, ob alles seinen gewünschten Weg geht, wenn das i.O. ist, -Y noch mit angeben.
 
OP
S

smguenther

Newbie
Hi,

jengelh schrieb:
$FTP/hxtools-20060909-0.i586.rpm
darin gibt es /usr/lib/hxtools/bin/filenameconv, mit dem du alle umdrehen kannst,
Code:
filenameconv -f iso8859-1 -t utf-8 /daten
Das zeigt dir an, ob alles seinen gewünschten Weg geht, wenn das i.O. ist, -Y noch mit angeben.

das hört sich toll an, ließ sich auch leicht installieren und dann habe ich folgenden Befehl eingeben:

/usr/lib/hxtools/bin/filenameconv -Y -f iso8859-1 -t utf-8 wpd/

Die letzte Zeile des Outputs lautet:

Processing "Z�lerlisten.pdf" => "Zählerlisten.pdf"

Stimmt aber nicht, die Datei heißt nun Z??hlerlisten.pdf.
Für jeden Durchlauf von filenameconv wird ein Fragezeichen hinzugefügt.
Allerdings nicht nur im Dateinamen, sondern auch bei mir :(

Und ein

stat Z??hlerlisten.pdf

liefert folgende Ausgabe:
File: `Z\303\244hlerlisten.pdf'
Size: 104411 Blocks: 224 IO Block: 4096 regular file
Device: 341h/833d Inode: 4325397 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 521/ sa) Gid: ( 100/ users)
Access: 2006-10-06 14:18:55.000000000 +0200
Modify: 2004-06-02 10:51:21.000000000 +0200
Change: 2006-10-10 16:36:02.000000000 +0200

Irgendwie scheint die Codierung auf diesem System völlig aus dem Ruder zu laufen.

Gruß,

Stefan
 

sc_m

Member
Ich hatte mir das so gedacht, dass du diesen iconv-Befehl verwendest, und zwar in etwa so:
Code:
find -type f | (while read file; do mv "$file" "$(echo "$file" | iconv -f ISO_8859-15 -t UTF-8 )" )
An der richtigen Stelle ausgeführt, sollte dieser Befehl alle Dateien in allen Unterverzeichnissen umbenennen, wenn die Verzeichnisnamen selbst keine Umlaute enthalten.
Falls es auch um Verzeichnisse geht, dann müssten die entsprechend vorher mit einem ähnlichen Befehl erstellt werden.
Ich übernehme aber natürlich keine Garantie, dass das wirklich so funktioniert. Du solltest es zumindest erst in einem Extra-Verzeichnis testen.

Ich fürchte allerdings, dass das Ergebnis so aussieht wie mit filenameconv.
 
smguenther schrieb:
Processing "Z�lerlisten.pdf" => "Zählerlisten.pdf"
Stimmt aber nicht, die Datei heißt nun Z??hlerlisten.pdf.
Für jeden Durchlauf von filenameconv wird ein Fragezeichen hinzugefügt.
Allerdings nicht nur im Dateinamen, sondern auch bei mir :(
Und ein
stat Z??hlerlisten.pdf
liefert folgende Ausgabe:
File: `Z\303\244hlerlisten.pdf'
Dann ist doch alles in Ordnung. Die UTF-8-Sequenz für "ä" ist 2 Byte lang ==> dein Terminal ist nicht auf UTF-8 eingestellt.
 
OP
S

smguenther

Newbie
sc_m schrieb:
Ich hatte mir das so gedacht, dass du diesen iconv-Befehl verwendest, und zwar in etwa so:
Code:
find -type f | (while read file; do mv "$file" "$(echo "$file" | iconv -f ISO_8859-15 -t UTF-8 )" )
An der richtigen Stelle ausgeführt, sollte dieser Befehl alle Dateien in allen Unterverzeichnissen umbenennen, wenn die Verzeichnisnamen selbst keine Umlaute enthalten.
Falls es auch um Verzeichnisse geht, dann müssten die entsprechend vorher mit einem ähnlichen Befehl erstellt werden.
Ich übernehme aber natürlich keine Garantie, dass das wirklich so funktioniert. Du solltest es zumindest erst in einem Extra-Verzeichnis testen.
Ich fürchte allerdings, dass das Ergebnis so aussieht wie mit filenameconv.

Bingo! Die Geschichte mit den doppelten Fragezeichen lag (warum auch immer) an meiner Shell. Nachdem ich mich mittels Putty von Windows aus (peinlich, peinlich) mit der Box verbunden hatte, habe ich die konvertierten Umlaute auch gesehen. Allerdings mußte ich Deinen Befehl korrigieren:

find -type f | (while read file; do mv -b "$file" "$(echo "$file" | iconv -f ISO_8859-15 -t UTF-8 )" ; done)

Das abschließende ;done fehlte noch, und da dies User zwischenzeitlich Kopien der Ordner angelegt und mit Umlaut geschrieben hatten, habe ich das mv mit -b versehen und anschließend noch mit "find -name "*~" nach Duplikaten gesucht.

DANKE für die Hilfe, hat mir eine Menge Ärger und Zeit erspart.

Gruß,

Stefan
 
Oben