Элегантный способ поиска файлов UTF-8 с помощью BOM?



для целей отладки мне нужно рекурсивно искать каталог для всех файлов, которые начинаются с метки порядка байтов UTF-8 (BOM). Мое текущее решение-это простой скрипт:



find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" == $'xefxbbxbf' ]
then
echo "found BOM in: $file"
fi
done


или, если вы предпочитаете короткие, читается острот:



find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'xefxbbxbf' ] && echo "found BOM in: $file";done


Он не работает с именами файлов, которые содержат строки,
но таких файлов все равно не стоит ожидать.



есть ли более короткий или более элегантное решение?



есть ли что-нибудь интересное текстовые редакторы или макросы для текстовых редакторов?

787   11  

11 ответов:

Как насчет этой простой команды, которая не просто находит, но и очищает неприятный BOM? :)

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

Я люблю "найти" :)

предупреждениевышеуказанного изменить двоичные файлы, которые содержат три символа.

.

Если вы хотите просто показать файлы спецификации, используйте этот:

grep -rl $'\xEF\xBB\xBF' .

лучший и самый простой способ сделать это на Windows:

Total Commander → перейти в корневой каталог проекта → найти файлы ( Alt + F7) → типы файлов *.* → Найти текст "EF BB BF" → установите флажок " Hex " → поиск

и вы получаете список :)

find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

большинство решений, приведенных выше, проверяют больше, чем первую строку файла, даже если некоторые (например, решение Маркуса) затем фильтруют результаты. Это решение проверяет только первую строку каждого файла, поэтому оно должно быть немного быстрее.

Если вы принимаете некоторые ложные срабатывания (в случае, если есть нетекстовые файлы, или в маловероятном случае есть ZWNBSP в середине файла), вы можете использовать grep:

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

Я бы использовал что-то вроде:

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

что гарантирует, что спецификация начинается с первого байта файла.

можно использовать grep чтобы найти их и Perl, чтобы раздеть их так:

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

для пользователя Windows см. этой (хороший PHP скрипт для поиска BOM в проекте).

излишним решением для этого является phptags (а не vi инструмент с тем же именем), который специально ищет PHP скрипты:

phptags --warn ./

выведет что-то вроде:

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

и --whitespace режим автоматически исправит такие проблемы (рекурсивно, но утверждает, что он только перезаписывает .PHP-скрипт.)

find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0 добавляет значение null \0 между каждой имя файла, вместо того, чтобы использовать новые строки
  • xargs -0 ожидает нулевые разделенные аргументы вместо разделенных строк
  • grep -l списки файлов, которые соответствуют регулярному выражению
  • регулярное выражение ^\xeff\xbb\xbf не совсем правильно, так как он будет соответствовать не-BOMed UTF-8 файлов, если они имеют нулевые пробелы ширины в начале строки

я использовал это, чтобы исправить только файлы JavaScript:

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

Если вы ищете файлы UTF, то file command строительство. Он расскажет вам, что такое кодировка файла. Если там есть какие-либо символы, отличные от ASCII, он придумает UTF.

file *.php | grep UTF

это не будет работать рекурсивно, хотя. Вероятно, вы можете настроить какую-то причудливую команду, чтобы сделать ее рекурсивной, но я просто искал каждый уровень индивидуально, как показано ниже, пока у меня не закончились уровни.

file */*.php | grep UTF

Comments

    Ничего не найдено.