Como posso encontrar todos os arquivos de texto codificados em UTF-16 em uma árvore de diretórios com um comando Unix?

6

Eu quero usar um comando shell do Unix para encontrar todos os arquivos codificados UTF-16 ( contendo a Marca de Ordem de Byte UTF-16 ( BOM )) em uma árvore de diretórios. Existe um comando que eu possa usar?

    
por Jochen 19.03.2010 / 01:33

5 respostas

7

Embora você tenha solicitado a localização da lista de materiais, o uso de file pode até gerar resultados quando essa lista técnica não estiver presente. De man file :

If a file does not match any of the entries in the magic file, it is examined to see if it seems to be a text file. ASCII, ISO-8859-x, non-ISO 8-bit extended-ASCII character sets (such as those used on Macintosh and IBM PC systems), UTF-8-encoded Unicode, UTF-16-encoded Unicode, and EBCDIC character sets can be distinguished by the different ranges and sequences of bytes that constitute printable text in each set. If a file passes any of these tests, its character set is reported.

Por isso, por exemplo:

find . -type f -exec file --mime {} \; | grep "charset=utf-16"
    
por 20.03.2010 / 14:49
1

Você pode usar grep :

 grep -rl $(echo -ne '^7677') *

(Testado com bash e GNU grep, pode funcionar com outros.)

Explicação:

A parte $ (echo ... gera o BOM (Hex FE FF, como sequências de escape octal), isso é então alimentado para grep como seu padrão, prefixado com '^' (= início da linha de correspondência).

-r é uma pesquisa recursiva, -l faz o grep imprimir os nomes dos arquivos encontrados (em vez da linha correspondente).

Isso pode ser um pouco exagerado, pois o grep verificará cada arquivo completamente, em vez de apenas iniciar. Se for principalmente pequenos arquivos de texto, isso não importará. Se você tem um monte de arquivos com vários MB, você terá que escrever um script perl: -).

Como alternativa, você pode tentar file (combinado com find + xargs). file identificará UTF-16 (como "dados de caracteres Unicode UTF-16"). Eu não sei quão confiável é, no entanto (como ele usa heurística).

    
por 19.03.2010 / 01:58
1

Aqui está o script que eu uso para encontrar arquivos UTF-16, e subseqüentemente os converto em UTF-8.     #! / bin / sh

find ./ -type f |
while read file; do
    if [ "'head -c 2 -- "$file"'" == $'\xff\xfe' ]
    then
        echo "Problems with: $file"
        # If you want to convert to UTF-8 uncomment these lines.
        #cat "$file" | iconv -f UTF-16 -t UTF-8 > "$file.tmp"
        #mv -f "$file.tmp" "$file"
    fi
done
    
por 22.04.2010 / 20:13
1

Se você tiver, você pode usar enca :

enca -L none * 2>/dev/null | grep  -i "Universal character"
    
por 19.03.2010 / 04:41
0

Obrigado pela ajuda a todos. O que funcionou melhor no meu Mac foi:

find . -type f -exec awk -F '\n' '/^\xFE\xFF|\xFF\xFE/ { print FILENAME; nextfile } { nextfile }' {} \;

Ele é baseado na solução de sleske, mas leva em conta que a marca de ordem de byte pode ser revertida. Ele também usa o awk para parar de procurar pela BOM após a primeira linha, pois a BOM deve estar no início do arquivo. O \ x escape usado para especificar a BOM trabalha com o bash, não sei se funciona com outras shells.

A ferramenta de encaixe sugerida pelo ghostdog74 também fará o trabalho, mas não estava presente no meu Mac.

    
por 20.03.2010 / 14:25