Как узнать двоичный файл из текстовых файлов в Linux
Команда linux file
выполняет очень хорошую работу по распознаванию типов файлов и дает очень мелкие результаты. Инструмент diff
способен сообщать двоичные файлы из текстовых файлов, создавая другой вывод.
Есть ли способ узнать, что бинарные файлы формируют текстовые файлы? Все, что я хочу, это ответ "да/нет", является ли данный файл двоичным. Поскольку трудно определить двоичный файл, скажем, я хочу знать, будет ли diff
пытаться сопоставить текст.
Чтобы прояснить вопрос: мне все равно, является ли это ASCII-текст или XML до тех пор, пока он текст. Кроме того, я не хочу различать файлы MP3 и JPEG, поскольку они все являются двоичными.
Ответы
Ответ 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 обнаруживают это довольно легко (и быстро). Вы можете посмотреть их источник.