file использует несколько видов теста :
1: Если файл не существует, не может быть прочитан или его состояние файла не может быть определено, выходные данные должны указывать, что файл был обработан, но его тип не может быть определен.
Это будет вывод как cannot open file: No such file or directory.
2: Если файл не является обычным файлом, его тип файла должен быть идентифицирован. Каталог типов файлов, FIFO, сокет, специальный блок и специальный символ должны быть идентифицированы как таковые. Другие определяемые реализацией типы файлов также могут быть идентифицированы. Если файл является символической ссылкой, по умолчанию ссылка должна быть разрешена, и файл должен проверять тип файла, на который ссылается символическая ссылка. (См. -hИ -iварианты ниже.)
Это будет выводиться как .: directoryи /dev/sda: block special. Большая часть формата этого и предыдущего пункта частично определяется POSIX - вы можете положиться на определенные строки, находящиеся в выходных данных.
3: Если длина файла равна нулю, он должен быть идентифицирован как пустой файл.
Это foo: empty.
4. Файловая утилита должна исследовать начальный сегмент файла и делать предположения при определении его содержимого на основе чувствительных к положению тестов. (Ответ не гарантированно будет правильным; см. Параметры -d, -M и -m ниже.)
5: файловая утилита должна проверить файл и сделать предположение при определении его содержимого на основе контекстных системных тестов по умолчанию. (Ответ не гарантированно будет правильным.)
Эти два используют идентификацию магического числа и являются наиболее интересной частью команды. Магическое число это специальная последовательность байт , которая находится в известном месте в файл , который идентифицирует его типа. Традиционно это место - первые два байта, но термин был расширен, чтобы включить более длинные строки и другие местоположения. Смотрите этот другой вопрос для более подробной информации о магических числах в fileкоманде.
У fileкоманды есть база данных этих номеров и тому, какому типу они соответствуют; эта база данных обычно находится /usr/share/mime/magicи отображает содержимое файла в MIME-типы . Выходные данные там (часто часть, file -iесли вы не получаете его по умолчанию) будут определенным типом носителя или расширением. «Контекстно-зависимые тесты» используют такой же подход, но они немного размыты. Ничто из этого не может быть правильным, но они предназначены для хороших догадок.
fileтакже имеется база данных, сопоставляющая эти типы с именами, по которой он узнает, что файл, который он идентифицировал, application/pdfможет быть описан как PDF document. Эти понятные человеку имена также могут быть локализованы на другой язык. Это всегда будет какое-то высокоуровневое описание типа файла, понятное человеку, а не машине.
Большинство различных результатов, которые вы можете получить, будут получены на этих этапах. Вы можете посмотреть в magicфайле список поддерживаемых типов и то, как они определены - моя система знает 376 различных типов. Указанные имена и поддерживаемые типы определяются вашей системой упаковки и конфигурации, и поэтому ваша система может поддерживать больше или меньше, чем у меня, но, как правило, их много. libmagicтакже включает в себя дополнительные жесткие тесты в нем.
6: файл должен быть идентифицирован как файл данных.
Это foo: dataкогда он ничего не понял в файле.
Есть и другие маленькие теги, которые могут появиться. Исполняемый файл ( +x) будет включать " executable" в выводе, обычно через запятую. fileРеализация может также знать дополнительные вещи о некоторых форматах файлы , чтобы иметь возможность описать дополнительные пункты о них, как и в вашем « PDF document, version 1.4».