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
».