Найти файлы по кодировке символов

Найти файлы по кодировке символов

У меня есть долго работающий скрипт 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файлы python ( ) в pwd на наличие недопустимого кода в позиции 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 {} \;

Связанный контент