Dateien in UTF-8 Kodierung konvertieren

L

lord-spam

Eroberer
hallo,

ich habe hier jetzt schon viel rum gestöbert, aber noch nichts dazu gefunden...

ich habe ein Verzeichnis mit mehreren Dateien (text), die zum Teil verschiedene Kodierungen haben.

Diese möchte ich nun alle in UTF-8 konvertieren.
Mit file finde ich herraus wie sie Kodiert ist, und mit iconv kann ich es umwandeln, doch möchte ich dies automatisieren.

Das Problem ist, das die Dateien verschiedene Kodierungen haben und ich nicht weiß wie ich es so lösen könnte.

Habt ihr eine Idee wie man dies machen könnte?
 
Hallo

Bau dir ein Skript mit Fallunterscheidung.
e.g.
Code:
$ find ./ -type f -exec file {} \; |
while read f code rest;
do 
case "$code" in 
ASCII ) echo ${f/:/} ist ASCII;; 
UTF-8) echo ${f/:/} ist UTF-8;;
 ISO-8859) echo ${f/:/} ist ISO-8859;;
esac;
done

Nur als Gedankenanstoß.

Gruß Wolfgang
 
danke :) das ist ein sehr guter Gedankenanstoß...
 
Hab mal nen kleines Script geschrieben, vielleicht interessiert dich es. Das macht einfach nur das: Es guckt was benutzt wird ASCII / UTF8 / ISO8859-* und wandelt es dann in utf8 um. Funktionieren tuts einigermaßen, habe leider grad keine Zeit da ich noch arbeiten muss -.- Vielleicht kriegst du in Eigeninitiative was besseres hin!

Einfach nach /usr/local/bin oder sonstwo und chmod u+x script.sh.

Code:
#!/bin/bash
# set -x
[[ "$#" != 3 ]] && echo "Usage: $(basename $0) <ASCII|UTF-8|ISO-8859-*> <path> <pattern>" && exit 
pfad=${2}
pattern=${3}
to=$(echo ${1} | tr '[[:upper:]]' '[[:lower:]]')
files=$(find "$pfad" -iname "*$pattern*" -type f -print)

function code() {
    count=0
    for f in ${files[*]}; do
        count=$(( $count + 1))
        type="$(file "$f" | sed 's/^.*:\s\(UTF-8\|ASCII\)\s.*/\1/' | tr '[[:upper:]]' '[[:lower:]]')"
        if [ "$type" = "$to" ]; then
            echo -n "$count: $f is already $to! => done."
        else
            case $type in
                ASCII|ISO-8859-*|UTF-8|ascii|iso-8859-*|utf-8)
                echo -n "$count: Recode now $f to $to!"
                iconv -f "$type" -t "$to" "$f" > "${f}.${to}"
                mv "${f}.${to}" "$f"
                [[ $? = 0 ]] && echo -n " => done." || echo " => failed."
                ;;
                *)
                echo -n "$count: $f has wrong type => failed."
                ;;
                esac && echo
        fi 
    done 
}

case $1 in
    ASCII|ISO-8859-*|ascii|iso-8859-*|UTF-8|utf-8)
        code $1;;
    *)
        exit;;
esac

stephan@unimatrix ~ $ ./mycode.sh
Usage: mycode.sh <ASCII|UTF-8|ISO-8859-*> <path> <pattern>
 
Zuletzt bearbeitet:
smg:

dein Script brachte mich noch weiter... ich hab mir auch eins zusammen gebastelt. Hab vorher noch nie wirklich mit Shell geschrieben.

Nur kann ich jetzt von vorne anfangen. Meins war eigentlich für meine Bedürfnisse fertig, doch gab es noch nen Fehler. Leider lag das Script im selben Verzeichnis und wurde auch behandelt, so dumm wie ich bin hab ich es vorher nicht gesichert, und nun ist es leer >.<

naja trotzdem danke... wenn ich es fertig habe werde ich es vllt. noch hier posten.
 

Ähnliche Themen

[Tcl / Shell] Ändern einer Datei per vi - Änderungsdatum einer Datei erfassen

Inhalte in einer Datei suchen und Dateiname ausgeben

E-Mail Empfang, Aliases unter Debian Squeeze

FreeBSD Server - sed Problem

Datei-Reader

Zurück
Oben