我有一个长时间运行的 python 脚本,无法对文件进行 utf-8 解码。错误消息没有告诉我它在哪个文件上失败,只是它无法解码0x81
位置中的字节194
。我知道该文件位于哪个文件夹中,但不知道该子树中数千个文件中的哪个文件夹。我可以通过哪些选项来查找此文件(以及其他类似文件)? bash 中有一个漂亮的单行语句吗?
更改脚本以打印它所查看的内容并重新运行它,一次修复一个文件,这几乎不是一种选择,因为运行脚本一次需要几个小时。用 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 {} \;