Re: Umlaute und andere Sonderzeichen in Dateinamen konvertieren?

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Sun, 16 Mar 2014 13:19:39 +0100 (CET)

Peter Ulrich Kruppa wrote:
> leider schicken mir begeisterte Windows-Nutzer ständig Dokumente mit ä,
> ö, ü, ß, é und anderen lustigen Sonderzeichen im Dateinamen zu, was
> langsam beim Backup lästig wird.

Gegen Umlaute und andere sprachspezifische Zeichen ist eigentlich
nichts einzuwenden. Problematisch wird es nur dann, wenn die
dabei beteiligten Betriebssysteme unterschiedliche Vorstellungen
von der Kodierung haben, z.B. wenn es in einem Fall als UTF-8
und im anderen Fall als ISO 8859 aufgefasst wird.

> Haben wir irgendein nützliches Kommandozeilen-Tool, mit dem man einen
> Verzeichnisbaum durchsuchen und diese Sonderzeichen automatisch durch
> irgendwas FreeBSD-gängigeres ersetzen kann?

Ob es ein fertiges Tool gibt, ist mir leider nicht bekannt.
Es gibt aber eine Reihe von Kommandozeilen-Tools, die als
Filter fungieren (standard input --> standard output) und
dabei die Kodierung übersetzten, z.B.:

$ recode latin9..utf-8

oder:

$ iconv -f latin9 -t utf-8

Bei Dateien von den Windows-Freunden kommt hierzulande statt
latin9 (ISO 8859-15) in der Regel Codepage 1252 zum Einsatz.
In dem Fall bei obigen Kommandos "cp1252" statt "latin9"
schreiben.

Am einfachsten wäre es, man schreibt sich ein kleines
Shell-Skript dafür:

#!/bin/sh -
for OLD in "$@"; do
      NEW=$(echo -n "$OLD" | iconv -f cp1252 -t utf-8)
      mv -- "$OLD" "$NEW"
done

Wenn man dieses Skript als "mv-cp1252-utf8" speichert, dann
konvertiert folgender Aufruf alle Dateinamen unter einem
Verzeichnisbaum nach UTF-8:

$ find -d /baum/wurzel -print0 | xargs -0 mv-cp1252-utf8

Wichtig ist "-d", damit die Verzeichnisse erst nach den Dateien
darin umbenannt werden, sonst ergeben sich ungültige Pfade.
"-print0" und "-0" sorgen dafür, dass das Ganze auch mit
Namen funktioniert, die Leerzeichen u.ä. enthalten.

Bei umfangreichen Verzeichnisstrukturen dauert das ein bisschen,
da für jeden einzelnen Namen eine Subshell mit iconv geforkt
werden muss, außerdem ein Aufruf von mv(1). Möchte man das
effizienter machen, muss man ein paar Zeilen in einer Skript-
Sprache wie Python oder Perl investieren, aber im allgemeinen
dürfte sich der Aufwand nicht lohnen.

Theoretisch kann man statt UTF-8 auch ISO 8859 als gemeinsame
(Ziel-)Kodierung verwenden, aber das führt dann zu Problemen,
wenn Zeichen vorkommen, die in ISO 8859 nicht darstellbar
sind. Beliebt sind z.B. gerichtete Anführungzeichen oben und
unten, Ellipse (Triple-dot), n-dash und m-dash. Die gibt es
alle nicht in ISO 8859-1.

Aufpassen muss man beim Euro-Zeichen: Das ist in CP1252 und
ISO 8859-15 (= latin9) an verschiedenen Stellen! ISO 8859-1
(= latin1) enthält überhaupt kein Euro-Zeichen und sollte
heutzutage generell vermieden werden.

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG,  Marktplatz 29, 85567 Grafing
Handelsregister:  Amtsgericht Muenchen, HRA 74606, Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsreg.: Amtsgericht München,
HRB 125758, Geschäftsführer:  Maik Bachmann,  Olaf Erb,  Ralf Gebhart
FreeBSD-Dienstleistungen/-Produkte + mehr: http://www.secnetix.de/bsd
Python is executable pseudocode.  Perl is executable line noise.
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sun 16 Mar 2014 - 13:19:49 CET

search this site