Как найти все текстовые файлы в кодировке UTF-16 в дереве каталогов с помощью команды Unix?

Я хочу использовать команду оболочки Unix, чтобы найти все UTF-16 закодированные файлы (содержащие UTF-16 Byte Order Mark (BOM)) в дереве каталогов. Есть ли команда, которую я могу использовать?

28
задан Peter Mortensen
09.03.2023 6:09 Количество просмотров материала 2856
Распечатать страницу

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"
7
отвечен Arjan 2023-03-10 13:57

можно использовать 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"). Однако я не знаю, насколько он надежен (поскольку он использует эвристику).

1
отвечен sleske 2023-03-10 16:14

вот сценарий, который я использую, чтобы найти 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
1
отвечен 2023-03-10 18:31

Если у вас есть это, вы можете использовать enca:

enca -L none * 2>/dev/null | grep  -i "Universal character"
1
отвечен user31894 2023-03-10 20:48

Спасибо за помощь всем. Что работало лучше всего на моем Mac было:

find . -type f -exec awk -F '\n' '/^\xFE\xFF|\xFF\xFE/ { print FILENAME; nextfile } { nextfile }' {} \;

Он основан на решении sleske, но учитывает, что метка порядка байтов может быть инвертирована. Он также использует awk, чтобы остановить поиск спецификации после первой строки, так как спецификация должна быть в начале файла. Экранирование \x, используемое для указания, что спецификация работает с bash, я не знаю, работает ли она с другими оболочками.

инструмент enca, предложенный ghostdog74, также выполнит эту работу, но он не присутствовал на моем Mac.

0
отвечен Jochen 2023-03-10 23:05

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх