Buscar archivos por codificación de caracteres

Buscar archivos por codificación de caracteres

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 0x81en 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 isutf8del moreutilspaquete:

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 .pylos 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 {} \;

información relacionada