100 votes

Manière élégante pour rechercher des fichiers UTF-8 avec BOM ?

À des fins de débogage, j'ai besoin de recherche de manière récursive un répertoire de tous les fichiers qui commencent avec un encodage UTF-8 marque d'ordre des octets (BOM). Ma solution actuelle est un simple script shell:

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done

Ou, si vous préférez court, illisible, one-liners:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

Il ne fonctionne pas avec des noms de fichiers qui contiennent un saut de ligne, mais ces fichiers ne sont pas à craindre de toute façon.

Est-il plus ou moins solution plus élégante?

Il n'existe aucun texte intéressant des éditeurs ou des macros pour les éditeurs de texte?

178voto

Denis Points 884

Qu'en est-il de cette commande simple qui non seulement trouve, mais efface les noms désagréables? :)

 find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
 

J'aime "trouver" :)

Si vous voulez seulement afficher les fichiers de nomenclature, utilisez celui-ci:

 grep -rl $'\xEF\xBB\xBF' .
 

42voto

Jan Przybylo Points 209

Le meilleur moyen facile de le faire sous Windows:

total commander -> aller au répertoire racine du projet -> rechercher des fichiers (alt + f7) -> types de fichiers *. * -> rechercher du texte "EF BB BF" -> cocher la case "Hex" -> rechercher

et vous obtenez la liste :)

13voto

Aron Griffis Points 706
 find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'
 

La plupart des solutions données ci-dessus testent plus que la première ligne du fichier, même si certaines (comme la solution de Marcus) filtrent ensuite les résultats. Cette solution teste uniquement la première ligne de chaque fichier, elle devrait donc être un peu plus rapide.

8voto

CesarB Points 18048

Si vous acceptez des faux positifs (s'il existe des fichiers autres que du texte ou, dans le cas peu probable, un fichier ZWNBSP au milieu d'un fichier), vous pouvez utiliser grep:

 fgrep -rl `echo -ne '\xef\xbb\xbf'` .
 

5voto

Marcus Griep Points 3010

Je voudrais utiliser quelque chose comme:

 grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
 

Ce qui garantit que la nomenclature se produit à partir du premier octet du fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X