Элегантный способ поиска файлов 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Он не работает с именами файлов, которые содержат строки,
но таких файлов все равно не стоит ожидать.
есть ли более короткий или более элегантное решение?
есть ли что-нибудь интересное текстовые редакторы или макросы для текстовых редакторов?
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