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 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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top