Sonderzeichen in Dateinamen.

Macke1979

FreeBSD-User
Hallo Leute,

ich habe ein Problem... Wenn ich mit Freunden Daten austausche und Dateien zugeschickt bekomme, so ergeben sich Schwierigkeiten, wenn beispielsweise Umlaute in den Dateinamen gebraucht werden. Diese werden dann unter FreeBSD mit einem ? ersetzt und die Datei lässt sich weder umbenennen, noch in irgendeiner Weise bearbeiten. Wenn sich solche Dateien in einem Archiv befinden, erhalte ich bei dem Versuch, diese mit xarchiver zu entpacken, ebenfalls eine Fehlermeldung bzw ich kann das gesamte Archiv nicht entpacken. Gibt es beispielsweise so etwas wie einen Konverter, mit der man den Zeichensatz bei den Dateinamen in UTF-8 umwandeln kann? Oder irgendeinen anderen Weg dieses Problem zu lösen? Ich habe selbst nach umfrangreicher Recherche im Netz nicht wirklich was gefunden.
 
ich hatte selbst mehrmals iconv benutzt, was bei FreeBSD wohl zur Basis gehört.
Bei manchen wirren Zeichen tut es auch ein tr, ebenfalls Teil der Basis.

Eine andere, aber Artverwandte Sache, ist das Mounten von msdosfs. Dabei werden die Dateinamen auch "übersetzt" und oft unleserlich. Da kann eine entsprechende mount-option manchmal helfen.

In den letzten Jahren hatte ich dieserlei Probleme nicht mehr. Vielleicht benutzt nun Windows auch UTF-8 als Standard? Jedenfalls habe ich alle meine eigenen Dateinamen (also jene, die auf dem Server liegen), nach UTF-8 gewandelt. Wobei mir eben bewusst wird, dass ich auch seit Jahren gar keine Windows-Gäste mehr im Haus habe. Vielleicht gibt es deshalb keine Probleme mehr ;)
 
ich hatte selbst mehrmals iconv benutzt, was bei FreeBSD wohl zur Basis gehört.
Ja. Mit iconv könnte man convmv auch nachbauen. So a-la
find . -type f -exec sh -c 'mv "{}" "$(echo {} | iconv -f iso8859-1 -t UTF-8)"' \;

ist das Mounten von msdosfs. Dabei werden die Dateinamen auch "übersetzt"
Ja. Man kann die Option -L benutzen, um das zu beeinflussen:
https://man.freebsd.org/cgi/man.cgi?query=mount_msdosfs&sektion=8
 
Hast du deine System auf überhaupt auf UTF-8? (/etc/login.conf oder ~/.login_conf)?
Ich denke schon.
Code:
shinji@freebsd:~ $ grep charset /etc/login.conf
    :charset=UTF-8:\
    :charset=UTF-8:\
shinji@freebsd:~ $
Vielleicht benutzt nun Windows auch UTF-8 als Standard?
Hm... Also, ich habe mit convmv die Dateinamen von iso8859-1 nach utf-8 gewandelt, hat super geklappt und ich kann die Dateien ganz normal öffnen oder auch kopieren.^^
 
sieh doch mal, was locale sagt, ebenfalls im Basis-System bei FreeBSD enthalten.
Die Ausgabe von locale lautet bei mir wie folgt:
Code:
shinji@freebsd:~ $ locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_ALL=
shinji@freebsd:~ $
Also definitiv UTF-8 und ich bin mir ziemlich sicher, dass es sich da um die Voreinstellung handelt. Wobei ich die Variable LANG in .profile auf den entsprechenden Wert gesetzt habe, um meine Desktop-Umgebung (XFCE) von English auf Deutsch umzustellen. ;)
 
Ich hatte mir früher damit beholfen:

Code:
# Nimmt alle 'fehlbenannten' in Verzeichnis:

    for file in `ls $1/* | tr ' ' '^'` ; do

        isofile=$file

        # UTF8:

        utf=`echo $file | grep 'Ã'`

# utf2iso: iconv -c -s -f UTF-8 -t ISO-8859-15 2>/dev/null

        if [ -n "$utf" ] ; then isofile=`echo $file | utf2iso` ; fi

        name=`
            echo $isofile                |\
                                         \
            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    `echo $file | tr '^' '*'`    `echo $name | tr '^' '-'`

    done

Ich schätze mal, für Leute die Bash-Scripting beherrschen, ist das grauselig und von A-Z nicht akzeptabel.
Habe ich aber jahrelang benutzt.

'iconv' ist gut, um ISO in UTF umzuwandeln und umgekehrt, aber ehrlich gesagt finde ich Umlaute und schlimmer noch Leerzeichen in Dateinamen die Pest. Der Midnight-Commander kann Archive öffnen (man geht sozusagen einfach rein) und dann kann man ja möglicherweise direkt umbenennen.
 
Ich schätze mal, für Leute die Bash-Scripting beherrschen
Für das reine Substring-Ersetzen in Bashscripts muss man nicht den Umweg über sed gehen, sondern kann auch ne builtin-Funktion der Bash nutzen :
name=${isofile//Ä/Ae}
(siehe dazu die Manpage und such da nach ${parameter/pattern/string})
Das kann man auch mehrmals hintereinander ausführen und dann kannst Du
Bash:
name=${isofile//Ä/Ae}
name=${isofile//Ö/Oe}
name=${isofile//Ü/Ue}
name=${isofile//ä/ae}
name=${isofile//ö/oe}
name=${isofile//ü/ue}
name=${isofile//ß/ss}
schreiben.

Wenn Du testen willst, ob eine Variable ein Zeichen enthält musst Du nicht den Umweg über grep gehen:
if [[ "$file" == *Ä* ]]; then
Willst Du eher auf mehrere Zeichen prüfen, kannst Du das so machen:
if [[ "$file" == *@(Ä|Ö|Ü)* ]]; then

schlimmer noch Leerzeichen in Dateinamen
Bash:
name=${isofile// /-} # Leerzeichen zu "Bindestrich"

utf2iso: iconv -c -s -f UTF-8 -t ISO-8859-15 2>/dev/null
Das 2>/dev/null würde ich weglassen, weil wenn iconv ein Fehler meldet ist es ja sinnvoll, das man den sieht. Mal davon abgesehen das das -s ja ohnehin schon dafür sorgt das zumindest invalid-character-Fehler nicht aufs stderr gehen.

Das geht bestimmt eleganter.
Das mit dem tr usw. würde ich mir alles sparen. Und wenn Du eh Umlaute ersetzt, dann brauchst Du ja auch keine Zeichensatzumwandlung per iconv mehr (es sei denn es gibt noch andere non-ASCII-Charakters; da müsste man halt darauf prüfen). So würde ich das obige Skript zusammenkürzen auf:
Bash:
# Nimmt alle 'fehlbenannten' in Verzeichnis:
for file in `ls $1/* ; do
    newname=${newname//Ä/Ae}
    newname=${newname//Ö/Oe}
    newname=${newname//Ü/Ue}
    newname=${newname//ä/ae}
    newname=${newname//ö/oe}
    newname=${newname//ü/ue}
    newname=${newname//ß/ss}
    newname=${newname// /-}
    mv "$file" "$newname"
done
Oder hab ich irgendwas übersehen / nicht-bedacht ?
 
Ja ich suchte nach UTF mit "Ã", weil UTF-Umlaute in ISO in genau so einer Kombination dargestellt werden.

Weil ich von SuSE nach Slackware kam, und Dateinamen mit Umlauten benutzt hatte.
SuSE war schon auf UTF8 und SL-12 noch bei ISO. (Das kann man natürlich einstellen).

Dazu war das System (zB die Konsole) also auf ISO. der von mir bis heute benutzte Roxfiler wollte aber trotzdem lieber UTF...

Jedenfalls wurde mir da erst bewusst, daß Umlaute in Dateinamen eine einzige Nerverei darstellen.

Auch newname=${newname//ö/oe} wird nur dann korrekt arbeiten, wenn ihm der richtige Codeset vorgesetzt wird.

Darum muß mit file oder (einfacher) suche nach "Ã" (nicht Ä) festgestellt werden, ob iconv benutzt werden muß, damit das nachfolgende Script überhaupt arbeiten kann.

Ziel sollte sein, alle nicht ASCII-Zeichen und Leerzeichen rauszuschmeißen.

Bei Rox kann man so ein Script sehr leicht über 'senden an' einrichten (aus solchen Gründen liebe ich ihn, obwohl veraltet)
 
Zurück
Oben