php - utf8 - ¿Manera elegante de buscar archivos UTF-8 con BOM?
utf-8 without bom sublime text (11)
¿Qué pasa con este simple comando que no solo encuentra sino que borra la desagradable base de datos? :)
find . -type f -exec sed ''1s/^/xEF/xBB/xBF//'' -i {} /;
Me encanta "encontrar" :)
Advertencia Lo anterior modificará los archivos binarios que contienen esos tres caracteres.
.
Si solo desea mostrar archivos BOM, use este:
grep -rl $''/xEF/xBB/xBF'' .
Para fines de depuración, necesito buscar recursivamente en un directorio todos los archivos que comienzan con una marca de orden de bytes UTF-8 (BOM). Mi solución actual es un simple script de shell:
find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" == $''/xef/xbb/xbf'' ]
then
echo "found BOM in: $file"
fi
done
O, si prefieres líneas cortas cortas e ilegibles:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $''/xef/xbb/xbf'' ] && echo "found BOM in: $file";done
No funciona con nombres de archivos que contienen un salto de línea, pero tales archivos no se esperan de todos modos.
¿Hay alguna solución más corta o más elegante?
¿Hay editores de texto o macros interesantes para los editores de texto?
La mejor y más fácil forma de hacerlo en Windows:
Total Commander → ir al directorio raíz del proyecto → buscar archivos ( Alt + F7 ) → tipos de archivos *. * → Buscar texto "EF BB BF" → marcar casilla de verificación ''Hex'' → buscar
Y obtienes la lista :)
Lo usé para corregir solo archivos JavaScript:
find . -iname *.js -type f -exec sed ''s/^/xEF/xBB/xBF//'' -i.bak {} /; -exec rm {}.bak /;
Para un usuario de Windows, vea this (buen script PHP para encontrar la BOM
de BOM
en su proyecto).
Puedes usar grep
para encontrarlos y Perl para eliminarlos así:
grep -rl $''/xEF/xBB/xBF'' . | xargs perl -i -pe ''s{/xEF/xBB/xBF}{}''
Si acepta algunos falsos positivos (en caso de que haya archivos que no sean de texto, o en el caso improbable que haya un ZWNBSP en el medio de un archivo), puede usar grep:
fgrep -rl `echo -ne ''/xef/xbb/xbf''` .
Si está buscando archivos UTF, el comando de archivo funciona. Te dirá cuál es la codificación del archivo. Si hay caracteres no ASCII allí, aparecerá UTF.
file *.php | grep UTF
Eso no funcionará recursivamente sin embargo. Probablemente pueda improvisar un comando elegante para hacerlo recursivo, pero solo busqué cada nivel individualmente como el siguiente, hasta que me quede sin niveles.
file */*.php | grep UTF
Una solución exagerada para esto es phptags
(no la herramienta vi
con el mismo nombre), que busca específicamente scripts PHP:
phptags --warn ./
Producirá algo así como:
./invalid.php: TRAILING whitespace ("?>/n")
./invalid.php: UTF-8 BOM alone ("/xEF/xBB/xBF")
Y el modo --whitespace
corregirá automáticamente estos problemas (recursivamente, pero afirma que solo reescribe scripts .php).
Yo usaría algo como:
grep -orHbm1 "^`echo -ne ''/xef/xbb/xbf''`" . | sed ''/:0:/!d;s/:0:.*//''
Lo que asegurará que la BOM ocurra comenzando en el primer byte del archivo.
find -type f -print0 | xargs -0 grep -l `printf ''^/xef/xbb/xbf''` | sed ''s/^/found BOM in: /''
-
find -print0
pone null / 0 entre cada nombre de archivo en lugar de usar nuevas líneas -
xargs -0
espera argumentos separados nulos en lugar de separados por línea -
grep -l
enumera los archivos que coinciden con la expresión regular - La expresión regular
^/xeff/xbb/xbf
no es del todo correcta, ya que coincidirá con los archivos UTF-8 que no tienen BOM, si tienen espacios de ancho cero al comienzo de una línea
find . -type f -print0 | xargs -0r awk ''
/^/xEF/xBB/xBF/ {print FILENAME}
{nextfile}''
La mayoría de las soluciones dadas anteriormente prueban más que la primera línea del archivo, incluso si algunas (como la solución de Marcus) luego filtran los resultados. Esta solución solo prueba la primera línea de cada archivo, por lo que debería ser un poco más rápido.