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

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

ファイルをUTF-8にデコードできない長期間実行されるPythonスクリプトがあります。エラーメッセージは、どのファイルが失敗したかを知らせず、場所0x81のバイトをデコードできないことを示しています194。ファイルがどのフォルダーにあるかはわかりますが、そのサブツリー内の何千ものファイルのうちどのフォルダーにあるかはわかりません。このファイル(およびその他の類似ファイル)を見つけるにはどのようなオプションが必要ですか? Bashに美しい一行文がありますか?

表示内容を印刷するようにスクリプトを変更し、一度に1つのファイルを変更するために再実行するのは、スクリプトの実行に数時間かかるため、ほとんどオプションではありません。 Pythonでディレクトリウォーカーを書くのはあまりにも多くの作業のようです。

答え1

isutf8パッケージで使用moreutils:

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

または:

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

(後者はファイル名に改行文字がないと仮定します.)

答え2

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

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

これにより、このコマンドはファイルが失敗した場所を印刷します。

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

したがって、.pypwdのすべてのpython()ファイルの場所180に誤ったコードがあるかどうかをテストします。

$ 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 {} \;

関連情報