Мне нужно распознать тип данных, содержащихся в случайных файлах. Я новичок в Linux.
Я планирую использовать file
команду, чтобы понять, какой тип данных имеет файл. Я попробовал эту команду и получил вывод ниже.
Кто-то предложил мне, чтобы file
команда проверяла начальные байты файла, чтобы определить тип данных. Команда file
вообще не смотрит на расширение файла. Это верно? Я посмотрел на страницу руководства, но почувствовал, что она слишком техническая. Я был бы признателен, если бы кто-нибудь мог предоставить ссылку, которая имеет гораздо более простое объяснение того, как file
работает команда.
Каковы возможные варианты ответов после выполнения file
команды? Например, в приведенной ниже расшифровке я получаю JPEG, ISO media, ASCII и т.д .:
Вывод на экран выглядит следующим образом
m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data
Обновление 1
Спасибо за ответы, и они разъяснили мне пару вещей.
Поэтому, если я правильно понимаю, папка / usr / share / mime / magic имеет базу данных, которая даст мне текущие возможные форматы файлов (выходные данные, которые я могу получить, когда набираю команду file и следую за ней по файлу). это верно? Правда ли, что всякий раз, когда вывод команды «Файл» содержит слово «текст», он относится к чему-то, что вы можете прочитать с помощью средства просмотра текста, и что-либо без «текста» является своего рода двоичным файлом?
источник
Ответы:
file
использует несколько видов теста :Это будет вывод как
cannot open file: No such file or directory
.Это будет выводиться как
.: directory
и/dev/sda: block special
. Большая часть формата этого и предыдущего пункта частично определяется POSIX - вы можете положиться на определенные строки, находящиеся в выходных данных.Это
foo: empty
.Эти два используют идентификацию магического числа и являются наиболее интересной частью команды. Магическое число это специальная последовательность байт , которая находится в известном месте в файл , который идентифицирует его типа. Традиционно это место - первые два байта, но термин был расширен, чтобы включить более длинные строки и другие местоположения. Смотрите этот другой вопрос для более подробной информации о магических числах в
file
команде.У
file
команды есть база данных этих номеров и тому, какому типу они соответствуют; эта база данных обычно находится/usr/share/mime/magic
и отображает содержимое файла в MIME-типы . Выходные данные там (часто часть,file -i
если вы не получаете его по умолчанию) будут определенным типом носителя или расширением. «Контекстно-зависимые тесты» используют такой же подход, но они немного размыты. Ничто из этого не может быть правильным, но они предназначены для хороших догадок.file
также имеется база данных, сопоставляющая эти типы с именами, по которой он узнает, что файл, который он идентифицировал,application/pdf
может быть описан какPDF document
. Эти понятные человеку имена также могут быть локализованы на другой язык. Это всегда будет какое-то высокоуровневое описание типа файла, понятное человеку, а не машине.Большинство различных результатов, которые вы можете получить, будут получены на этих этапах. Вы можете посмотреть в
magic
файле список поддерживаемых типов и то, как они определены - моя система знает 376 различных типов. Указанные имена и поддерживаемые типы определяются вашей системой упаковки и конфигурации, и поэтому ваша система может поддерживать больше или меньше, чем у меня, но, как правило, их много.libmagic
также включает в себя дополнительные жесткие тесты в нем.Это
foo: data
когда он ничего не понял в файле.Есть и другие маленькие теги, которые могут появиться. Исполняемый файл (
+x
) будет включать "executable
" в выводе, обычно через запятую.file
Реализация может также знать дополнительные вещи о некоторых форматах файлы , чтобы иметь возможность описать дополнительные пункты о них, как и в вашем «PDF document, version 1.4
».источник
Страницы руководства обычно являются краткими ссылками, а не введениями. Начните со страницы Википедии .
file
смотрит только на содержимое файла, а не на имя файла. (Также рассматриваются некоторые метаданные файла, такие как тип файла: каталог, символическая ссылка, именованный канал и т. Д. Но в тех случаях, которые вас интересуют, важен контент.)file
обычно угадывает формат файла, просматривая первые несколько байтов и сравнивая их со встроенной таблицей магических чисел . Например, если файл начинается с%PDF
, тоfile
сообщает «PDF документ» (и копает дальше, чтобы сообщить минимальную версию). Для типов файлов, которые не начинаются с магических чисел, он содержит эвристику, например, сообщает «текст ASCII», если все первые несколько байтов находятся в диапазоне ASCII для печати.Вывод
file
хрупок: он может варьироваться от варианта Unix к варианту Unix и от версии к версии. В Linux, Cygwin и * BSDfile
команда поддерживает параметр,-i
который создает предсказуемый вывод в виде типа носителя MIME (IANA управляет списком стандартных типов носителей ). Деталей не так много, и результат менее понятен для человека, но результат предсказуем и удобен для компьютера.Используйте,
file --mime-type
если вам нужен только сам тип MIME без информации о кодировании, напримерapplication/pdf
. Укажите опцию,-b
если вы не хотите отображать имя файла в начале строки.источник
Я хотел бы, чтобы вы прочитали ответ отсюда . Некоторые выдержки из ответа:
С man-страницы
file
команды,file
Команда фактически выполняет 3 теста по определению типа файла.Первый тест
Второй тест
Третий тест
Вывод
file
команды, как правило, основан на результате любого из успешных тестов.Теперь, если предположить, что программа на C ++ запускается так, а третий тест проходит успешно,
В соответствии с третьим тестом ключевое слово, в
#include
частности, указывает, что оно относится к программе типа C, хотя у нас есть программа CPP . Теперь, когда я проверяю,Теперь концепции объектно-ориентированного подхода специфичны для C ++. Давайте создадим файл, специфичный для C ++ .
Я запускаю свою программу на C ++ как,
Теперь, когда я выпускаю
Выход есть,
Это в основном объясняет, как
file
команда работает с похожими файлами (в этом примере программы на C и C ++ обрабатываются одинаково до тех пор, пока мы не используем объектно-ориентированные функции, специфичные для C ++).источник
Жиль и Майкл Гомер дали отличные ответы. к которому я вас отсылаю. Чтобы увидеть типы файлов, распознаваемые в вашей системе, попробуйте запустить
Если это дает разрешение проблем или не существует, то, возможно,
(может потребоваться настройка в зависимости от вашей системы), которая должна показать вам список типов файлов в вашей системе. Эта команда может долго выполняться в зависимости от размера вашей корневой файловой системы.
источник