Para fins de depuração, preciso pesquisar recursivamente em um diretório todos os arquivos que começam com uma marca de ordem de bytes (BOM) UTF-8. Minha solução atual é um script de shell simples:
find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
then
echo "found BOM in: $file"
fi
done
Ou, se você preferir linhas curtas e ilegíveis:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
Não funciona com nomes de arquivo que contenham uma quebra de linha, mas de qualquer maneira esses arquivos não são esperados.
Existe alguma solução mais curta ou mais elegante?
Existem editores de texto ou macros interessantes para editores de texto?
php
utf-8
shell
text-editor
vog
fonte
fonte
grep -rlI $'\xEF\xBB\xBF' .
para ignorar arquivos binários.A maneira melhor e mais fácil de fazer isso no Windows:
Total Commander → vá para o diretório raiz do projeto → encontre arquivos ( Alt+ F7) → tipos de arquivo *. * → Encontre o texto "EF BB BF" → marque a caixa de seleção 'Hex' → pesquisar
E você obtém a lista :)
fonte
A maioria das soluções fornecidas acima testa mais do que a primeira linha do arquivo, mesmo que algumas (como a solução de Marcus) filtrem os resultados. Esta solução testa apenas a primeira linha de cada arquivo, portanto, deve ser um pouco mais rápida.
fonte
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Se você aceitar alguns falsos positivos (no caso de haver arquivos que não sejam de texto, ou no caso improvável de haver um ZWNBSP no meio de um arquivo), você pode usar grep:
fonte
Eu usaria algo como:
O que garantirá que o BOM ocorra começando no primeiro byte do arquivo.
fonte
Você pode usar
grep
para encontrá-los e Perl para removê-los assim:fonte
Para um usuário do Windows, veja isto (bom script PHP para encontrar o
BOM
em seu projeto).fonte
Uma solução exagerada para isso é
phptags
(não avi
ferramenta com o mesmo nome), que procura especificamente por scripts PHP:Irá produzir algo como:
E o
--whitespace
modo corrigirá automaticamente esses problemas (recursivamente, mas afirma que só reescreve scripts .php).fonte
find -print0
coloca um nulo \ 0 entre cada nome de arquivo em vez de usar novas linhasxargs -0
espera argumentos separados por nulos em vez de separados por linhagrep -l
lista os arquivos que correspondem ao regex^\xeff\xbb\xbf
não está totalmente correto, pois corresponderá a arquivos UTF-8 não BOMed se eles tiverem espaços de largura zero no início de uma linhafonte
Usei isso para corrigir apenas arquivos JavaScript:
fonte
Se você estiver procurando por arquivos UTF, o comando file funciona. Ele dirá qual é a codificação do arquivo. Se houver algum caractere não ASCII nele, ele aparecerá com UTF.
Isso não funcionará recursivamente. Você provavelmente pode montar algum comando sofisticado para torná-lo recursivo, mas eu apenas procurei cada nível individualmente como o seguinte, até que os níveis acabaram.
fonte