Elegante forma de búsqueda de archivos UTF-8 con la lista de materiales?

Para propósitos de depuración, tengo que buscar de forma recursiva en un directorio de todos los archivos que comienzan con un UTF-8 marca de orden de bytes (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 corto, ilegible uno-trazadores de líneas:

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 estos archivos no son de esperar de todos modos.

Hay más corto o más elegante solución?

Hay alguna interesante de los editores de texto o macros para los editores de texto?

InformationsquelleAutor vog | 2008-10-15

11 Kommentare

  1. 159

    Lo que acerca de este simple comando que no sólo busca pero borra desagradable BOM? 🙂

    find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;

    Me encanta «buscar» 🙂

    AdvertenciaLos anteriores modificar archivos binarios que contienen los tres personajes.

    .

    Si desea simplemente para mostrar archivos de lista de materiales, el uso de este:

    grep -rl $'\xEF\xBB\xBF' .
    • Brillante, señor… gracias!! 🙂
    • Detecta incorrectamente PDF con un marcador BOM.. que es debido a que se busca en todo el documento, no sólo la primera línea
    • Modifica los archivos binarios…
    • O con ack: «ack ‘\xEF\xBB\xBF'»
    • cambiar el comando sed para añadir un 1 antes de que el líder de ‘s’ por lo que sólo se aplica a la primera línea
    • el grep es encontrar muchos archivos binarios así, corregir el uso de algo como egrep -rl $'^\xEF\xBB\xBF', e incluso este greps inicio de las líneas y no sólo la primera línea.
    • Uso grep -rlI $'\xEF\xBB\xBF' . ignorar los archivos binarios.
    • Detecta y modifica JPG y otros archivos binarios, como ya se dijo.
    • ¿Cuál es el punto de la creación de una «.bak» archivo de la sed, sólo para quitar en el siguiente «-exec»? He editado para hacer sed simplemente corregir los archivos en el lugar. Ver:stackoverflow.com/posts/2858757/…
    • Gracias por corromper a mi .repositorio git .pack de archivos!!! :)) Se Agregó Una Advertencia.

  2. 39

    La manera mejor y más fácil para hacer esto en Windows:

    Total Commander → ir a la raíz del proyecto dir → buscar archivos (Alt + F7) → tipos de archivo *.* → Encontrar el texto «EF BB BF» → comprobar ‘Hex’ casilla de búsqueda →

    Y se obtiene la lista 🙂

    • Agradable, especialmente el uso de mi favorito de tiempo Total commander, pero, por desgracia, sufre el mismo problema que muchos otros: busca todos los bytes de un archivo, tantas imágenes, etc, se informó. Esto puede ser ligeramente mejorada mediante el uso de Expresiones regulares en lugar de Hex y la búsqueda para «^\xEF\xBB\xBF» que va a eliminar muchas de las imágenes, pero aún tiene los archivos que tienen la lista de materiales a mitad de camino a través del archivo (aunque no deben ser pocos) y, por supuesto, los archivos binarios que tienen un ascii newline charcode sólo beofre la lista de materiales. Aún así, todas las imágenes se habían ido en mi búsqueda de prueba.
  3. 13
    find . -type f -print0 | xargs -0r awk '
        /^\xEF\xBB\xBF/{print FILENAME}
        {nextfile}'

    La mayoría de las soluciones dadas por encima de prueba más de la primera línea del archivo, incluso si algunos (como Marcus solución), a continuación, filtrar los resultados. Esta solución sólo las pruebas de la primera línea de cada archivo, por lo que debería ser un poco más rápido.

    • La tienes es trabajar con la siguiente en Linux (RHEL6) – find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
    • ¿Cómo tengo que modificar el código para solucionar estos archivos después de que se encontraron?
  4. 7

    Si acepta algunos falsos positivos (en el caso de que no existen archivos de texto, o en el improbable caso de que haya un ZWNBSP en el medio de un archivo), puede utilizar grep:

    fgrep -rl `echo -ne '\xef\xbb\xbf'` .
  5. 5

    Me gustaría usar algo como:

    grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

    Que se asegurará de que la lista de materiales se produce a partir en el primer byte del archivo.

  6. 5

    Puede utilizar grep para encontrarlos y Perl para tira de ellos así:

    grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
    • Este trabajó para mí, la aceptó respuesta no (estoy en un Mac)
  7. 4

    Para un usuario de Windows, consulte este (buen script de PHP para encontrar el BOM en su proyecto).

  8. 3

    Una exageración solución a esto es phptags (no la vi herramienta con el mismo nombre), que busca específicamente para los scripts PHP:

    phptags --warn ./

    De salida será algo como:

    ./invalid.php: TRAILING whitespace ("?>\n")
    ./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

    Y la --whitespace modo automáticamente solucionar dichos problemas (de forma recursiva, pero afirma que sólo se reescribe .scripts php.)

  9. 2
    find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
    • find -print0 pone un nulo \0 entre cada nombre de archivo en lugar de utilizar nuevas líneas
    • xargs -0 espera null separados argumentos en lugar de línea separados
    • grep -l enumera los archivos que coincidan con la expresión regular
    • El regex ^\xeff\xbb\xbf no es del todo correcta, ya que le coincidencia no BOMed archivos UTF-8 si tienen un ancho de cero espacios al inicio de una línea de
    • Usted todavía necesita un «cabeza de 1» en la tubería antes de que el grep
  10. 2

    He usado este para corregir los archivos JavaScript:

    find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
  11. 0

    Si usted está buscando para UTF archivos, el archivo de comandos obras. Él le dirá lo que la codificación del archivo. Si hay alguna persona que no los caracteres ASCII de ahí va a venir para arriba con UTF.

    file *.php | grep UTF

    Que no funcionan de forma recursiva, aunque. Usted probablemente puede armar algún capricho comando para que se recursiva, pero acabo de buscar cada nivel individual como en el siguiente, hasta que se me acabó niveles.

    file */*.php | grep UTF

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea