Localizar arquivos por codificação de caracteres

4

Eu tenho um script python de longa execução que falhou ao utf-8 decodificar um arquivo. A mensagem de erro não me diz qual arquivo falhou, apenas que não foi possível decodificar o byte 0x81 na posição 194 . Eu sei em qual pasta o arquivo está, mas não entre os milhares de arquivos em algum lugar dessa subárvore. Quais são minhas opções para encontrar este arquivo (e outros como ele)? Existe uma bonita linha de uma pessoa para isso?

Mudar o script para imprimir o que está vendo e refazer o processo, consertando um arquivo de cada vez, é apenas uma opção, já que executar o script leva várias horas. Escrever um traverser de diretório no Python parece um pouco demais.

    
por Filip Haglund 28.10.2016 / 17:06

2 respostas

2

Para criar um arquivo com falha semelhante, podemos usar esse script:

{ printf '%*s' "179"; printf '\x81'; printf '%*s' "20"; } >infile

Então este comando irá imprimir em qual posição o arquivo falha:

$ isutf8 infile 
infile: line 1, char 1, byte offset 180: invalid UTF-8 code

Então, isso testará todos os arquivos python ( .py ) no pwd para um código inválido na posição 180:

$ isutf8 ./*.py | grep "offset 180"

Ou ainda mais flexível, um intervalo de deslocamentos (gnu regex estendido):

$ isutf8 ./*.py | grep -E "offset (17|18)"

Ou, um teste específico para arquivos dentro de todo o diretório:

$ find . -iname "*.py" -type f -exec bash -c 'isutf8 "$1" | grep -E "offset (17|18)"' Find {} \;
    
por 29.10.2016 / 01:31
2

Usando isutf8 do pacote moreutils :

find . -name '*.py' -exec isutf8 {} +

Ou:

find . -name '*.py' | xargs isutf8

(Sob o pressuposto de que os nomes dos arquivos não têm novas linhas.)

    
por 29.10.2016 / 00:37