Как отличить двоичный файл от текстовых файлов в 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 обнаружить его довольно легко (и быстро). Вы можете взглянуть на их источник.