長時間実行している 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 {} \;