Как отличить двоичный файл от текстовых файлов в linux

в Linux file команда делает очень хорошую работу по распознаванию типов файлов и дает очень мелкозернистые результаты. The diff инструмент способен отличить двоичные файлы от текстовых файлов, производя другой вывод.

есть ли способ сообщить двоичные файлы в виде текстовых файлов? Все, что я хочу, это ответ Да/нет, является ли данный файл двоичным. Поскольку трудно определить двоичный файл, скажем, я хочу знать, если diff попытается выполнить текстовое сравнение.

для уточнения вопрос: мне все равно, если это текст ASCII или XML, пока это текст. Кроме того, я не хочу различать файлы MP3 и JPEG, поскольку они все двоичные.

8 ответов


на diff руководство указывает, что

diff определяет, является ли файл текстом или двоичный, проверив первые несколько байт в файле; точное количество байтов зависит от системы, но это обычно несколько тысяч. Если каждый байт в этой части файла non-null, diff считает файл текст; в противном случае он рассматривает файл бинарный.


file еще нужную команду. Любой файл, который является текстом (в соответствии с его эвристикой), будет включать слово "текст" в вывод file; все, что является двоичным, не будет включать слово "текст".

если вы не согласны с эвристики,file использует для определения текста против не-текста, тогда вопрос должен быть лучше указан, так как текст против не-текста является по своей сути неопределенным вопросом. Например, file не идентифицирует блок открытого ключа PGP в ASCII как "текст", но вы можете (поскольку он состоит только из печатаемых символов, даже если он не читается человеком).


быстрый-и-грязный способ-искать NUL символ (нулевой байт)в первых K или двух файлах. Пока вы не беспокоитесь о UTF-16 или UTF-32, ни один текстовый файл не должен содержать NUL.

обновление: согласно руководству diff, это именно то, что diff делает.


вы можете попытаться дать

strings yourfile

команда и сравните размер с размером файла ... я не совсем уверен, но если они одинаковы, файл действительно является текстовым файлом.


в наши дни термин "текстовый файл" неоднозначен, потому что текстовый файл может быть закодирован в ASCII, ISO-8859-*, UTF-8, UTF-16, UTF-32 и так далее.

посмотреть здесь для того, как Subversion это делает.


этот подход использует те же критерии, что и grep при определении того, является ли файл двоичным или текстовым:

is_text_file() { 
  grep -qI '.' ""
}

используемые параметры grep:

  • -q Quiet; выход немедленно с нулевым статусом, если какое-либо совпадение найдено
  • -I обрабатывать двоичный файл, как если бы он не содержал соответствующие данные

используется шаблон grep:

  • '.' матч любой один символ. Все файлы (кроме пустого файла) будет соответствуйте этой схеме.

Примечания

  • пустой файл не считается текстовым файлом в соответствии с этим тестом.
  • символические ссылки.

быстрый способ сделать это в ubuntu-использовать nautilus в представлении "список". Столбец type покажет вам, если его текст или двоичный


команды, как меньше, grep обнаружить его довольно легко (и быстро). Вы можете взглянуть на их источник.