ファイルを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
したがって、.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 {} \;