Para fines de depuración, necesito buscar de forma recursiva en un directorio todos los archivos que comienzan con una marca de orden de bytes (BOM) UTF-8. Mi solución actual es un script de shell simple:
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 prefiere frases breves 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 archivo que contienen un salto de línea, pero de todos modos no se esperan tales archivos.
¿Existe alguna solución más corta o más elegante?
¿Hay editores de texto o macros interesantes para editores de texto?
fuente
grep -rlI $'\xEF\xBB\xBF' .
para ignorar archivos binarios.La mejor y más sencilla forma de hacer esto en Windows:
Total Commander → ir al directorio raíz del proyecto → buscar archivos ( Alt+ F7) → tipos de archivo *. * → Buscar texto "EF BB BF" → marcar la casilla de verificación 'Hex' → buscar
Y obtienes la lista :)
fuente
La mayoría de las soluciones proporcionadas 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ápida.
fuente
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Si acepta algunos falsos positivos (en caso de que haya archivos que no sean de texto, o en el caso poco probable de que haya un ZWNBSP en medio de un archivo), puede usar grep:
fuente
Usaría algo como:
Lo que garantizará que la lista de materiales se produzca a partir del primer byte del archivo.
fuente
Puede usar
grep
para encontrarlos y Perl para eliminarlos así:fuente
Para un usuario de Windows, vea esto (buen script PHP para encontrarlo
BOM
en su proyecto).fuente
Una solución exagerada para esto es
phptags
(no lavi
herramienta con el mismo nombre), que busca específicamente scripts PHP:Producirá algo como:
Y el
--whitespace
modo solucionará automáticamente dichos problemas (de forma recursiva, pero afirma que solo reescribe scripts .php).fuente
find -print0
pone un \ 0 nulo entre cada nombre de archivo en lugar de usar nuevas líneasxargs -0
espera argumentos separados por nulos en lugar de separados por líneasgrep -l
enumera los archivos que coinciden con la expresión regular^\xeff\xbb\xbf
no es del todo correcta, ya que coincidirá con archivos UTF-8 no BOMed si tienen espacios de ancho cero al comienzo de una líneafuente
Usé esto para corregir solo archivos JavaScript:
fuente
Si está buscando archivos UTF, el comando de archivo funciona. Le dirá cuál es la codificación del archivo. Si hay algún carácter que no sea ASCII, aparecerá con UTF.
Sin embargo, eso no funcionará de forma recursiva. Probablemente pueda configurar algún comando elegante para hacerlo recursivo, pero solo busqué cada nivel individualmente como el siguiente, hasta que me quedé sin niveles.
fuente