実行時間の長いpythonスクリプトがutf-8でファイルをデコードできませんでした。エラーメッセージでは、どのファイルで失敗したかがわかりません。バイトをデコードできませんでした0x81
位置している 194
。ファイルがどのフォルダーにあるかはわかりますが、そのサブツリーのどこにある何千ものファイルのどこにあるかはわかりません。このファイル(およびその他のファイル)を見つけるための私のオプションは何ですか?これのためにbashにかなりワンライナーはありますか?
スクリプトを実行して何時間もかかるため、スクリプトを変更して、見ているものを印刷して再実行し、一度に1つのファイルを修正することは、ほとんどオプションではありません。 Pythonでディレクトリトラバーサーを作成することは、少しやり過ぎのようです。
moreutils
パッケージのisutf8
を使用する:
find . -name '*.py' -exec isutf8 {} +
または:
find . -name '*.py' | xargs isutf8
(ファイル名に改行がないことを前提として、後で説明します。)
同様に失敗するファイルを作成するには、次のスクリプトを使用できます。
{ 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 {} \;