У меня есть долго работающий скрипт 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 {} \;