À des fins de débogage, je dois rechercher de manière récursive dans un répertoire tous les fichiers commençant par une marque d'ordre d'octet (BOM) UTF-8. 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 des one-liners courts et illisibles:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
Cela ne fonctionne pas avec les noms de fichiers contenant un saut de ligne, mais de tels fichiers ne sont pas attendus de toute façon.
Existe-t-il une solution plus courte ou plus élégante?
Existe-t-il des éditeurs de texte intéressants ou des macros pour les éditeurs de texte?
grep -rlI $'\xEF\xBB\xBF' .
pour ignorer les fichiers binaires.La meilleure et la plus simple façon de procéder sous Windows:
Total Commander → aller dans le répertoire racine du projet → rechercher des fichiers ( Alt+ F7) → types de fichiers *. * → Rechercher le texte "EF BB BF" → cocher la case 'Hex' → rechercher
Et vous obtenez la liste :)
la source
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 alors les résultats. Cette solution ne teste que la première ligne de chaque fichier, elle devrait donc être un peu plus rapide.
la source
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Si vous acceptez des faux positifs (dans le cas où il y aurait des fichiers non texte, ou dans le cas peu probable il y aurait un ZWNBSP au milieu d'un fichier), vous pouvez utiliser grep:
la source
J'utiliserais quelque chose comme:
Ce qui garantira que la nomenclature se produit à partir du premier octet du fichier.
la source
Vous pouvez utiliser
grep
pour les trouver et Perl pour les supprimer comme ceci:la source
Pour un utilisateur Windows, voyez ceci (bon script PHP pour trouver le
BOM
dans votre projet).la source
Une solution exagérée à cela est
phptags
(pas l'vi
outil du même nom), qui recherche spécifiquement les scripts PHP:Sortira quelque chose comme:
Et le
--whitespace
mode résoudra automatiquement ces problèmes (récursivement, mais affirme qu'il ne réécrit que les scripts .php.)la source
find -print0
met un null \ 0 entre chaque nom de fichier au lieu d'utiliser de nouvelles lignesxargs -0
attend des arguments séparés par des valeurs nulles au lieu d'être séparés par des lignesgrep -l
répertorie les fichiers qui correspondent à l'expression régulière^\xeff\xbb\xbf
n'est pas tout à fait correct, car il correspondra aux fichiers UTF-8 non-BOMed s'ils n'ont aucun espace de largeur au début d'une lignela source
J'ai utilisé ceci pour corriger uniquement les fichiers JavaScript:
la source
Si vous recherchez des fichiers UTF, la commande de fichier fonctionne. Il vous dira quel est l'encodage du fichier. S'il y a des caractères non ASCII, il apparaîtra avec UTF.
Cela ne fonctionnera pas de manière récursive. Vous pouvez probablement configurer une commande sophistiquée pour la rendre récursive, mais j'ai juste recherché chaque niveau individuellement comme suit, jusqu'à ce que je manque de niveaux.
la source