Wie Codierung einer Datei in Unix über ein Skript finden (s)
Frage
Ich brauche die Codierung aller Dateien zu finden, die in einem Verzeichnis abgelegt werden. Gibt es eine Möglichkeit, die Codierung verwendet zu finden?
Der file
Befehl ist nicht in der Lage, dies zu tun.
Die Codierung, die von Interesse für mich ist: ISO-8859-1. Wenn die Codierung etwas anderes ist, möchte ich die Datei in ein anderes Verzeichnis verschieben.
Lösung
Klingt wie Sie für enca
suchen. Es kann erraten und wandeln sogar zwischen Kodierungen. Schauen Sie sich die Manpage .
oder andernfalls, Verwendung file -i
(Linux) oder file -I
(osx). Das wird ausgegeben MIME-Typinformationen für die Datei, die auch die Zeichensatz-Codierung umfasst. Ich fand eine Mann-Seite es auch:)
Andere Tipps
file -bi <file name>
Wenn Sie diese Dateien für einen Haufen tun
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
uchardet -. Eine Codierung Detektor Bibliothek von Mozilla portiert
Verbrauch:
~> uchardet file.java
UTF-8
Verschiedene Linux-Distributionen (Debian / Ubuntu, OpenSuse-packman, ...) Binärdateien zur Verfügung stellen.
Hier ist ein Beispiel-Skriptdatei -I und iconv verwendet, die auf MacOsX arbeitet Für Ihre Frage müssen Sie mv statt iconv verwenden
#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
case $encoding in
iso-8859-1)
iconv -f iso8859-1 -t utf-8 $f > $f.utf8
mv $f.utf8 $f
;;
esac
done
Es ist wirklich schwer zu bestimmen, ob es iso-8859-1 ist. Wenn Sie einen Text mit nur 7-Bit-Zeichen haben, die auch iso-8859-1 sein könnten, aber man weiß es nicht. Wenn Sie 8-Bit-Zeichen haben dann existieren die oberen Bereich Zeichen, um Kodierungen auch. Dafür Sie ein Wörterbuch verwenden, müßten eine bessere Vermutung zu bekommen, das Wort ist und bestimmen, von dort dem Brief muss es sein. Schließlich, wenn Sie feststellen, dass es utf-8 sein könnte, als Sie sicher sind, ist es nicht iso-8859-1
Codierung ist eines der schwierigsten Dinge zu tun, weil man nie weiß, ob nichts sagt Ihnen
Mit Python können Sie das chardet Modul verwenden: https://github.com/chardet/chardet
In Debian können Sie auch: encguess
:
$ encguess test.txt
test.txt US-ASCII
Das ist nicht etwas, das man in einer harmlosen Weise tun können. Eine Möglichkeit wäre, jedes Zeichen in der Datei zu prüfen, um sicherzustellen, dass es keine Zeichen enthält in den Bereichen 0x00 - 0x1f
oder 0x7f -0x9f
aber, wie gesagt, dies für eine beliebige Anzahl von Dateien wahr sein kann, einschließlich mindestens einer anderen Variante ISO8859.
Eine weitere Möglichkeit besteht darin, bestimmte Worte in der Datei in allen Sprachen zu suchen unterstützt und sehen, ob Sie sie finden können.
So zum Beispiel findet das Äquivalent der englischen „und“, „aber“, „auf“, „von“ und so weiter in allen unterstützten Sprachen von 8859-1 und sehen, ob sie eine großen Anzahl von haben Vorkommen innerhalb der Datei.
Ich spreche nicht über wörtliche Übersetzung wie:
English French
------- ------
of de, du
and et
the le, la, les
obwohl das möglich ist. Ich spreche über gemeinsame Wörter in der Zielsprache (für alles, was ich weiß, hat Icelandic kein Wort für „und“ - Sie würden wahrscheinlich ihr Wort für „Fisch“ verwenden [traurig das ist ein wenig stereotypisch, habe ich nicht bedeutet jede Straftat, nur einen Punkt darstellt]).
Wenn Sie sprechen über XML-Dateien (ISO-8859-1), die XML-Deklaration in ihnen gibt die Codierung: <?xml version="1.0" encoding="ISO-8859-1" ?>
So können Sie reguläre Ausdrücke verwenden (zum Beispiel mit perl
) jede Datei für diese Spezifikation zu überprüfen.
Weitere Informationen finden Sie hier: Wie Textdatei Encoding bestimmen.
Zur Umwandlung der Codierung von 8859 bis ASCII:
iconv -f ISO_8859-1 -t ASCII filename.txt
Ich weiß, dass Sie in eine allgemeinere Antwort interessiert sind, aber was in ASCII gut ist, ist in der Regel gut in andere Codierungen. Hier ist ein Python-Einzeiler, um zu bestimmen, ob die Standardeingabe ASCII ist. (Ich bin mir ziemlich sicher, dass dies in Python funktioniert 2, aber ich habe nur getestet es auf Python 3).
python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt
In Cygwin, das sieht aus wie es funktioniert für mich:
find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done
Beispiel:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done
Sie könnten Rohr, das zu awk und einen Befehl iconv schaffen, alles zu UTF8 konvertieren, aus einer beliebigen Quelle Codierung von iconv unterstützt.
Beispiel:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash
Sie können Codierung einer einzelnen Datei mit dem Dateibefehl extrahieren. Ich habe eine sample.html Datei mit:
$ file sample.html
sample.html: HTML-Dokument, UTF-8 Unicode-Text, mit sehr langen Linien
$ file -b sample.html
HTML-Dokument, UTF-8 Unicode-Text, mit sehr langen Linien
$ file -bi sample.html
text / html; charset = utf-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
utf-8
Ich bin mit dem folgende Skript
- Alle Dateien, die FILTER mit src_codierung entsprechen
- Erstellen Sie eine Sicherung von ihnen
- wandeln sie in DST_ENCODING
- (optional) Entfernen Sie die Sicherungen
.
#!/bin/bash -xe
SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"
echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')
for FILE in $FOUND_FILES ; do
ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
echo "Backup original file to $ORIGINAL_FILE"
mv "$FILE" "$ORIGINAL_FILE"
echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done
echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;
Mit Perl, Verwendung Encode :: erkennen.