Как я могу найти, что весь UTF-16 закодировал текстовые файлы в дереве каталогов с командой Unix?

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

7
задан 22.05.2012, 12:36

5 ответов

Хотя Вы попросили находить BOM, с помощью file мог бы даже дать Вы заканчиваетесь, когда такой BOM не присутствует. От man file:

Если файл не соответствует ни одной из записей в волшебном файле, он исследован, чтобы видеть, кажется ли это, текстовый файл. ASCII, ISO-8859-x, не-ISO, 8-разрядные наборы символов расширенного ASCII (такие как используемые в системах Macintosh и IBM PC), UTF-8-encoded Unicode, UTF-16-encoded Unicode и наборы символов EBCDIC могут отличить различные диапазоны и последовательности байтов, которые составляют печатаемый текст в каждом наборе. Если файл проходит какой-либо из этих тестов, о его наборе символов сообщают.

Следовательно, например:

find . -type f -exec file --mime {} \; | grep "charset=utf-16"
9
ответ дан 07.12.2019, 14:44

Можно использовать grep:

 grep -rl $(echo -ne '^\0376\0377') *

(Протестированный с bash и GNU grep, мог бы работать с другими.)

Объяснение:

$ (эхо... часть генерирует BOM (Шестнадцатеричный FE FF, как восьмеричные escape-последовательности), это затем питается к grep как его шаблон, предварительно ожидаемый с '^' (=match запускаются строки).

- r является рекурсивным поиском,-l заставляет grep распечатать названия файлов, которые он нашел (вместо согласующего отрезка длинной линии).

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

С другой стороны, Вы могли попробовать file (объединенный с find+xargs). file идентифицирует UTF-16 (как "данные символа UTF-16 Unicode"). Я не знаю, насколько надежный это, однако (поскольку это использует эвристику).

1
ответ дан 07.12.2019, 14:44

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

enca -L none * 2>/dev/null | grep  -i "Universal character"
1
ответ дан 07.12.2019, 14:44

Спасибо за справку все. То, что работало лучше всего над моим Mac, было:

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

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

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

0
ответ дан 07.12.2019, 14:44

Вот сценарий, который я использую для нахождения файлов 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
ответ дан 07.12.2019, 14:44

Теги

Похожие вопросы