Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

diff manual указывает, что

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

strings yourfile

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

Ответ 5

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

Смотрите здесь, как это делает Subversion.

Ответ 6

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

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

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

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

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

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

Примечания

  • Пустой файл не считается текстовым файлом в соответствии с этим тестом.
  • Соблюдайте символические ссылки.

Ответ 7

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

Ответ 8

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