Я хочу использовать команду оболочки Unix, чтобы найти все UTF-16 закодированные файлы (содержащие UTF-16 Byte Order Mark (BOM)) в дереве каталогов. Есть ли команда, которую я могу использовать?
Как найти все текстовые файлы в кодировке UTF-16 в дереве каталогов с помощью команды Unix?
5 ответов
хотя вы просили найти спецификацию, используя file
может даже дать вам результаты, когда такой спецификации нет. От man file
:
Если файл не совпадает ни с одной из записей в файле magic, это исследовал, чтобы увидеть, если это, кажется, текстовый файл. ASCII, ISO-8859-x, не-ISO 8-bit extended-ASCII character set (например, те, которые используются на Macintosh и IBM PC systems), кодировка UTF-8 Unicode, кодировка UTF-16 Unicode, и Наборы символов EBCDIC могут быть различенный различными рядами и последовательности байтов, которые составляют печатаемый текст в каждом наборе. Если файл проходит любой из этих тестов, сообщается его набор символов.
отсюда, например:
find . -type f -exec file --mime {} \; | grep "charset=utf-16"
можно использовать grep
:
grep -rl $(echo -ne '^7677') *
(проверено с bash
и GNU grep, может работать с другими.)
объяснение:
долларов США(Эхо... часть генерирует BOM (Hex FE FF, как восьмеричные escape-последовательности), это затем подается в grep
в качестве шаблона, предваряемого ' ^ ' (=соответствует началу строки).
-r-рекурсивный поиск,- l заставляет grep выводить имена найденных файлов (вместо соответствующей строки).
это может быть немного расточительно, как grep будет сканировать каждый файл полностью, а не только начать. Если это в основном небольшие текстовые файлы, это не имеет значения. Если у вас есть много файлов с несколькими МБ, вам придется написать сценарий perl: -).
кроме того, можно попробовать file
(в сочетании с find+xargs). file
определит UTF-16 (как "UTF-16 Unicode character data"). Однако я не знаю, насколько он надежен (поскольку он использует эвристику).
вот сценарий, который я использую, чтобы найти UTF-16 файлы, а затем преобразовать их в UTF-8. #!/ bin / sh
find ./ -type f |
while read file; do
if [ "`head -c 2 -- "$file"`" == $'\xff\xfe' ]
then
echo "Problems with: $file"
# If you want to convert to UTF-8 uncomment these lines.
#cat "$file" | iconv -f UTF-16 -t UTF-8 > "$file.tmp"
#mv -f "$file.tmp" "$file"
fi
done
Если у вас есть это, вы можете использовать enca
:
enca -L none * 2>/dev/null | grep -i "Universal character"
Спасибо за помощь всем. Что работало лучше всего на моем Mac было:
find . -type f -exec awk -F '\n' '/^\xFE\xFF|\xFF\xFE/ { print FILENAME; nextfile } { nextfile }' {} \;
Он основан на решении sleske, но учитывает, что метка порядка байтов может быть инвертирована. Он также использует awk, чтобы остановить поиск спецификации после первой строки, так как спецификация должна быть в начале файла. Экранирование \x, используемое для указания, что спецификация работает с bash, я не знаю, работает ли она с другими оболочками.
инструмент enca, предложенный ghostdog74, также выполнит эту работу, но он не присутствовал на моем Mac.
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]