В целях отладки мне нужно рекурсивно искать в каталоге все файлы, которые начинаются с отметки порядка байтов (BOM) UTF-8. Мое текущее решение - это простой сценарий оболочки:
find -type f |
while read file
do
if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
then
echo "found BOM in: $file"
fi
done
Или, если вы предпочитаете короткие, нечитаемые однострочные строки:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
Это не работает с именами файлов, которые содержат разрыв строки, но таких файлов в любом случае ожидать не следует.
Есть ли более короткое или элегантное решение?
Есть ли какие-нибудь интересные текстовые редакторы или макросы для текстовых редакторов?
источник
grep -rlI $'\xEF\xBB\xBF' .
для игнорирования двоичных файлов.Лучший и самый простой способ сделать это в Windows:
Total Commander → перейдите в корневой каталог проекта → найдите файлы ( Alt+ F7) → типы файлов *. * → Найдите текст «EF BB BF» → установите флажок «Hex» → поиск
И вы получите список :)
источник
Большинство приведенных выше решений проверяют не только первую строку файла, даже если некоторые (например, решение Маркуса) затем фильтруют результаты. Это решение проверяет только первую строку каждого файла, поэтому оно должно быть немного быстрее.
источник
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Если вы принимаете некоторые ложные срабатывания (в случае, если есть нетекстовые файлы или, что маловероятно, в середине файла есть ZWNBSP), вы можете использовать grep:
источник
Я бы использовал что-то вроде:
Это гарантирует, что спецификация будет начинаться с первого байта файла.
источник
Вы можете использовать их
grep
для поиска и Perl для их удаления следующим образом:источник
Для пользователя Windows см. Это (хороший сценарий PHP для поиска
BOM
в вашем проекте).источник
Излишним решением для этого является
phptags
(неvi
инструмент с таким же именем), который специально ищет сценарии PHP:Будет выводиться что-то вроде:
И
--whitespace
режим автоматически исправит такие проблемы (рекурсивно, но утверждает, что он только переписывает скрипты .php.)источник
find -print0
помещает нуль \ 0 между каждым именем файла вместо использования новых строкxargs -0
ожидает аргументы, разделенные нулем, вместо разделенных строкgrep -l
перечисляет файлы, соответствующие регулярному выражению^\xeff\xbb\xbf
не совсем корректно, поскольку оно будет соответствовать файлам UTF-8 без спецификации, если в начале строки у них есть пробелы нулевой ширины.источник
Я использовал это для исправления только файлов JavaScript:
источник
Если вы ищете файлы UTF, команда file работает. Он сообщит вам, какова кодировка файла. Если там есть какие-либо символы, отличные от ASCII, он будет предлагать UTF.
Однако это не будет работать рекурсивно. Вы, вероятно, можете настроить какую-нибудь причудливую команду, чтобы сделать ее рекурсивной, но я просто искал каждый уровень индивидуально, как показано ниже, пока у меня не закончились уровни.
источник