web-dev-qa-db-ja.com

Linuxでファイル名の言語エンコードを確認するにはどうすればよいですか?

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

filenamesの多くには、DBやWebに適さないスペースや句読点が含まれています。また、すべてのファイル名の末尾にSKU番号を追加したいと思います(会計上の目的で)。多くの場合、ほとんどのファイル名には拡張ラテン文字が含まれています保持したい SEOの目的(特に、ファイル名がGoogle画像のファイルの内容を正確に表すため)

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

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

彼らが現在使用しているwhich言語エンコーディングを簡単に見つける方法はありますか?

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

17
rwired

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

これで、ファイル名が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」変数によって、どの程度の推測が示されます。

14
Philip Reynolds

これは、現在の作業ディレクトリ(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'])
6
Klaus Kappel