Tengo un script de Python de larga duración que no pudo decodificar un archivo con utf-8. El mensaje de error no me dice en qué archivo falló, solo que no pudo decodificar el byte 0x81
en position 194
. Sé en qué carpeta se encuentra el archivo, pero no en qué parte de los miles de archivos se encuentran en ese subárbol. ¿Cuáles son mis opciones para encontrar este archivo (y otros similares)? ¿Hay alguna frase bonita en bash para esto?
Cambiar el script para imprimir lo que está viendo y volver a ejecutarlo, arreglando un archivo a la vez, apenas es una opción, ya que ejecutar el script una vez lleva muchas horas. Escribir un recorrido de directorio en Python parece demasiado trabajo.
Respuesta1
Usando isutf8
del moreutils
paquete:
find . -name '*.py' -exec isutf8 {} +
O:
find . -name '*.py' | xargs isutf8
(Esto último, bajo el supuesto de que los nombres de los archivos no tienen nuevas líneas).
Respuesta2
Para crear un archivo con un error similar, podemos usar este script:
{ printf '%*s' "179"; printf '\x81'; printf '%*s' "20"; } >infile
Luego, este comando imprimirá en qué posición falla el archivo:
$ isutf8 infile
infile: line 1, char 1, byte offset 180: invalid UTF-8 code
Entonces, esto probará todos .py
los archivos Python () en pwd para detectar un código no válido en la posición 180:
$ isutf8 ./*.py | grep "offset 180"
O incluso más flexible, una variedad de compensaciones (expresión regular extendida gnu):
$ isutf8 ./*.py | grep -E "offset (17|18)"
O una prueba específica para archivos dentro de todo el directorio:
$ find . -iname "*.py" -type f -exec bash -c 'isutf8 "$1" | grep -E "offset (17|18)"' Find {} \;