按字符编码查找文件

按字符编码查找文件

我有一个长时间运行的 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

因此,这将测试.pypwd 中的所有 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 {} \;

相关内容