Linuxでファイル名の言語エンコードを伝える方法は?


17

外部ソースからの〜10,000個の画像ファイルを含むディレクトリがあります。

ファイル名の多くには、DBフレンドリまたはWebフレンドリではないスペースと句読点が含まれています。また、すべてのファイル名の末尾にSKU番号を追加します(アカウンティングのため)。ほとんどではないにせよ、多くのファイル名には、SEOの目的で保持たい拡張ラテン文字も含まれています(具体的には、ファイル名がGoogleイメージのファイルの内容を正確に表しているため)

すべてのファイルの名前を希望の結果に変更(コピー)するbashスクリプトを作成しました。bashスクリプトはUTF-8で保存されます。実行後、約500個のファイルが省略されます(ファイルを統計できません...)。

私が実行したUTF-8 -t UTF-8 -f convmvをディレクトリに、これらの500個のファイル名がされて発見ない(convmvはUTF-8ですでにファイル名を検出し、無視することができます)UTF-8でエンコード

私は見つけることができます簡単な方法があるどの彼らが現在使用している言語エンコーディングは?

私が自分自身を理解できた唯一の方法は、端末エンコーディングをUTF-8に設定し、convmvで可能性のあるすべての候補エンコーディングを繰り返して、「正しいように見える」変換された名前を表示することです。これらの500個のファイルがすべて同じエンコードを使用していることを確認する方法がないため、このプロセスを500回繰り返す必要があります。「正しく見える」よりも自動化された方法が欲しいです!!!

回答:


13

100%正確な方法は実際にはありませんが、適切な推測を行う方法があります。

Pythonライブラリchardetがあります。https://pypi.python.org/pypi/chardet

例えば

現在のLANG変数の設定を確認します。

$ echo $LANG
en_IE.UTF-8

UTF-8でエンコードする必要があるファイル名を作成します

$ touch mÉ.txt

エンコーディングを変更し、試して一覧表示するとどうなるかを確認します

$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt

OK、ファイル名はUTF-8でエンコードされており、現在のロケールはC(標準のUnixコードページ)です。

したがって、Pythonを起動し、chardetをインポートしてファイル名を読み取るようにします。ファイルを取得するために、シェルグロビング(*ワイルドカード文字による展開)を使用しています。「ls m *」を、サンプルファイルのいずれかに一致するものに変更します。

>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}

ご覧のとおり、これは推測に過ぎません。どの程度の推測が「confidence」変数によって示されるか。


スクリプトは説明どおりに動作しますが、私の場合、chardetはファイルのエンコーディングを見つけられませんでした。
フェディルライクティック

6

現在の作業ディレクトリ(python 2.7)をテストするには、これが役立つことがあります。

import chardet
import os  

for n in os.listdir('.'):
    print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

結果は次のようになります。

Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)

現在のディレクトリからトラフパスを再帰するには、これを小さなPythonスクリプトにカットアンドペーストします。

#!/usr/bin/python

import chardet
import os

for root, dirs, names in os.walk('.'):
    print root
    for n in names:
        print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

それはアジアのエンコーディングでも動作しますか?それともユーロ中心ですか?
rwired
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.