Как отличить двоичные файлы от текстовых файлов в Linux - PullRequest
12 голосов
/ 15 апреля 2010

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

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

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

Ответы [ 8 ]

11 голосов
/ 15 апреля 2010

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

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

6 голосов
/ 15 апреля 2010

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

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

6 голосов
/ 15 апреля 2010

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

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

3 голосов
/ 15 апреля 2010

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

strings yourfile

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

1 голос
/ 14 января 2017

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

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

Используемые опции grep:

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

Использованный шаблон grep:

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

Примечания

  • В соответствии с этим тестом пустой файл не считается текстовым файлом.
  • Следуют символические ссылки.
1 голос
/ 15 апреля 2010

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

См. здесь , чтобы узнать, как это делает Subversion.

0 голосов
/ 20 октября 2014

Быстрый способ сделать это в Ubuntu - использовать nautilus в представлении «список». Столбец типа покажет вам, если его текст или двоичный файл

0 голосов
/ 16 апреля 2010

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

...