文字コードでファイルを検索する

文字コードでファイルを検索する

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

スクリプトを変更して、表示しているものを印刷し、それを再実行して、一度に 1 つのファイルを修正することは、スクリプトを 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

.pyしたがって、これはpwd 内のすべての 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 {} \;

関連情報