Un moyen élégant de rechercher des fichiers UTF-8 avec BOM?
-
03-07-2019 - |
Question
À des fins de débogage, je dois effectuer une recherche récursive dans un répertoire pour tous les fichiers commençant par une marque 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"`" ==
Ou, si vous préférez des lignes simples et illisibles:
find -type f|while read file;do [ "`head -c3 -- "$file"`" ==
Cela ne fonctionne pas avec les noms de fichiers contenant un saut de ligne,
mais de toute façon, de tels fichiers ne sont pas à prévoir.
Existe-t-il une solution plus courte ou plus élégante?
Existe-t-il des éditeurs de texte ou des macros intéressants pour les éditeurs de texte?
\xef\xbb\xbf' ]
then
echo "found BOM in: $file"
fi
done
Ou, si vous préférez des lignes simples et illisibles:
<*>
Cela ne fonctionne pas avec les noms de fichiers contenant un saut de ligne,
mais de toute façon, de tels fichiers ne sont pas à prévoir.
Existe-t-il une solution plus courte ou plus élégante?
Existe-t-il des éditeurs de texte ou des macros intéressants pour les éditeurs de texte?
\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 toute façon, de tels fichiers ne sont pas à prévoir.
Existe-t-il une solution plus courte ou plus élégante?
Existe-t-il des éditeurs de texte ou des macros intéressants pour les éditeurs de texte?
\xef\xbb\xbf' ] then echo "found BOM in: $file" fi doneOu, si vous préférez des lignes simples et illisibles:
<*>Cela ne fonctionne pas avec les noms de fichiers contenant un saut de ligne, mais de toute façon, de tels fichiers ne sont pas à prévoir.
Existe-t-il une solution plus courte ou plus élégante?
Existe-t-il des éditeurs de texte ou des macros intéressants pour les éditeurs de texte?
La solution
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 {} \;
J'aime "trouver" :)
Avertissement Ce qui précède va modifier les fichiers binaires contenant ces trois caractères.
.
Si vous souhaitez uniquement afficher les fichiers de nomenclature, utilisez celui-ci:
grep -rl \xEF\xBB\xBF' .
Autres conseils
Le moyen le plus simple et le plus simple de le faire sous Windows:
Total Commander & # 8594; Accédez au répertoire racine du projet & # 8594; rechercher des fichiers ( Alt + F7 ) & # 8594; types de fichiers *. * & # 8594; Rechercher du texte " EF BB BF " & # 8594; cochez la case "Hex" & # 8594; recherche
Et vous obtenez la liste:)
find . -type f -print0 | xargs -0r awk '
/^\xEF\xBB\xBF/ {print FILENAME}
{nextfile}'
La plupart des solutions indiquées ci-dessus testent davantage que la première ligne du fichier, même si certaines (comme la solution de Marcus) filtrent ensuite les résultats. Cette solution ne teste que la première ligne de chaque fichier, elle devrait donc être un peu plus rapide.
Si vous acceptez des faux positifs (s'il existe des fichiers non-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'` .
Je voudrais utiliser quelque chose comme:
grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
Ce qui garantit que la nomenclature a lieu à partir du premier octet du fichier.
Vous pouvez utiliser grep
pour les trouver et Perl pour les éliminer comme suit:
grep -rl \xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
Pour un utilisateur Windows, voir this (bon script PHP permettant de rechercher la BOM
dans votre projet).
Une phptags
(et non le ) constitue une solution excessive à ce problème. vi
avec le même nom), qui recherche spécifiquement les scripts PHP:
phptags --warn ./
affichera quelque chose comme:
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")
Et le mode - espaces
résoudra automatiquement ces problèmes (de manière récursive, mais affirme qu'il ne réécrit que les scripts .php.)
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
-
find -print0
place un null \ 0 entre chaque nom de fichier au lieu d'utiliser de nouvelles lignes -
xargs -0
attend des arguments null séparés au lieu de séparer des lignes -
grep -l
répertorie les fichiers qui correspondent à l'expression régulière - La regex
^ \ xeff \ xbb \ xbf
n'est pas tout à fait correcte, car elle correspond aux fichiers UTF-8 non BOMed si leurs espaces sont nuls au début d'une ligne
Je l'ai utilisé pour corriger uniquement les fichiers JavaScript:
find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
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, cela donnera UTF.
file *.php | grep UTF
Cela ne fonctionnera cependant pas de manière récursive. Vous pouvez probablement préparer une commande sophistiquée pour la rendre récursive, mais je viens de rechercher chaque niveau individuellement, comme suit, jusqu'à ce que je manque de niveaux.
file */*.php | grep UTF