web-dev-qa-db-ja.com

文字エンコーディングでファイルを検索する

実行時間の長いpythonスクリプトがutf-8でファイルをデコードできませんでした。エラーメッセージでは、どのファイルで失敗したかがわかりません。バイトをデコードできませんでした0x81 位置している 194。ファイルがどのフォルダーにあるかはわかりますが、そのサブツリーのどこにある何千ものファイルのどこにあるかはわかりません。このファイル(およびその他のファイル)を見つけるための私のオプションは何ですか?これのためにbashにかなりワンライナーはありますか?

スクリプトを実行して何時間もかかるため、スクリプトを変更して、見ているものを印刷して再実行し、一度に1つのファイルを修正することは、ほとんどオプションではありません。 Pythonでディレクトリトラバーサーを作成することは、少しやり過ぎのようです。

5
Filip Haglund

moreutilsパッケージのisutf8を使用する:

find . -name '*.py' -exec isutf8 {} +

または:

find . -name '*.py' | xargs isutf8

(ファイル名に改行がないことを前提として、後で説明します。)

3
phk

同様に失敗するファイルを作成するには、次のスクリプトを使用できます。

{ printf '%*s' "179"; printf '\x81'; printf '%*s' "20"; } >infile

次に、このコマンドは、ファイルが失敗した位置を出力します。

$ isutf8 infile 
infile: line 1, char 1, byte offset 180: invalid UTF-8 code

したがって、これはすべてをテストしますpython(.py)180の位置にある無効なコードのpwdファイル:

$ isutf8 ./*.py | grep "offset 180"

または、さらに柔軟な一連のオフセット(GNU拡張正規表現):

$ isutf8 ./*.py | grep -E "offset (17|18)"

または、ディレクトリ全体内のファイルに対する特定のテスト:

$ find . -iname "*.py" -type f -exec bash -c 'isutf8 "$1" | grep -E "offset (17|18)"' Find {} \;
2
Isaac