Sinn der Zeichenersetzung im Betreff war jetzt, dass die Zeichenkette danach möglichst kompatibel mit verschiedenen Dateisystemen ist.
Das Ersetzen der Leerzeichen durch Unterstriche (s/ /_/g
) ist optional, weil Leerzeichen im Dateinamen zwar unter Umständen Probleme machen können, was aber in diesem Fall zu vernachlässigen ist. Das war mir selber eher zum Testen wichtig, weil die Befehlszeile unter Linux sich etwas schwer damit tut.
Die anderen Teile des Befehls dagegen erschienen mir notwendig, wenn man die Dateien ggf. auf andere Dateisysteme übertragen möchte. Da kann es sonst beim Übertragen auch mal die Sonderzeichen im Dateinamen zerschießen bzw. die Datei gar nicht erstellt werden, weil wegen nicht erlaubte Zeichen im Dateinamen. Auf ext unter Linux wäre das nur das Zeichen /
wegen Pfadangaben, aber das müsste tatsächlich mindestens herausgefiltert werden.
Ich erkläre den Befehl einfach mal schrittweise:
iconv -f UTF-8 -t ASCII//TRANSLIT <<< "$betreff" | sed 's/[\/:*?"<>|]//g; s/ /_/g'
Ausgehend von der Ausgabe von mu view
in UTF-8 wird die Zeichenkette für den Betreff in ASCII konvertiert und alle Sonderzeichen, die nicht im Zeichensatz vorhanden sind, werden entweder bestmöglich oder durch ein ?
ersetzt (TRANSLIT
). Das vermeidet die Probleme mit der Zeichensatzkodierung, die entstehen, wenn man eine Datei mit Sonderzeichen im Dateinamen bspw. auf FAT32 überträgt. Abgesehen vom ?
, das unter FAT32 gar nicht erlaubt ist und im folgenden Schritt entfernt wird.
Löst auch ein Bonusproblem mit Unicode-Sonderzeichen. Die verwendete Schriftart muss das Sonderzeichen unterstützen, sonst kann es gar nicht dargestellt werden. Darauf bezog sich mitunter mein Beispiel mit dem Emoji „Milchstraße“ in einem meiner vorherigen Posts. Der Dateiname könnte in der Dateiverwaltung dann nur mit einem Platzhalter ausgegeben werden.
iconv -f UTF-8 -t ASCII//TRANSLIT <<< "$betreff" | sed 's/[\/:*?"<>|]//g; s/ /_/g'
Aus der ASCII-Zeichenkette werden dann alle Zeichen entfernt, die unter FAT, exFAT und NTFS nicht zulässig sind. Das sind die gebräuchlichen Dateisystem mit den meisten nicht erlaubten Zeichen (\/:*?"<>|
). Dabei wird eben auch das ?
entfernt, welches von TRANSLIT
für nicht erkannte Sonderzeichen erzeugt wird. Das Endergebnis kann dann problemlos auf diverse Dateisystem übertragen werden.
Wenn ein bereinigter Dateiname, der kompatibel mit den meisten Dateisystemen ist, für dich keine Rolle spielt, dann musst du für das Dateisystem ext unter Ubuntu eigentlich gar nicht unbedingt den Zeichensatz konvertieren und lediglich ein Zeichen (/
) entfernen:
dateibetreff="$(sed 's/[/]//g' <<< "$betreff")"
Möchte man dann doch mal ein paar Maildateien auf einen FAT32-formatierten USB-Stick kopieren, dann kann man die in ein Archivformat packen, das die Zeichensatzkodierung erhält, also bspw. tar.