Команда file

Команда file предназначена для задействования одноименной утилиты, осуществляющей определение типов переданных элементов файловой системы (файлов, директорий, ссылок, именованных каналов и сокетов). Данная утилита исследует содержимое файлов, а не ограничивается проверкой их расширений.

Если говорить конкретно, утилита выполняет до трех проверок каждого из указанных пользователем элементов файловой системы. Первая проверка заключается в использовании системного вызова stat(), позволяющего получить доступ к содержимому структуры inode элемента файловой системы. Системный вызов обрабатывается ядром операционной системы и позволяет выяснить, является ли элемент файловой системы обычным файлом, директорией, символьной или жесткой ссылкой, именованным каналом или сокетом.

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

В том случае, если файл не содержит магической последовательности байтов, определяется тип содержимого файла. Эта проверка, к примеру, позволяет выяснить, является ли файл обычным текстовым файлом, файлом формата HTML или файлом исходного кода. Кроме того, утилита пытается распаковать файл архива и выяснить тип сжатого файла.

Базовый синтаксис команды выглядит следующим образом:

$ file [параметры] файл1 ...

Обычно утилита используется без каких-либо параметров, вместо имен файлов могут использоваться шаблоны. Параметр -k позволяет принудительно выполнить все проверки для получения максимального объема информации об объектах файловой системы. Параметр -b позволяет не выводить имена исследуемых объектов файловой системы, что полезно в случае сбора статистики о типах файлов. Параметр -F позволяет указать символ-разделитель имени файла и строки с информацией о его типе. Параметр -f предназначен для передачи утилите имени текстового файла в строках которого приводятся имена объектов файловой системы, которые необходимо исследовать. Если вам нужны MIME-типы файлов, а не описания их типов, вы можете воспользоваться параметром -i. Для того, чтобы не обновлять метку времени доступа к объектам файловой системы может использоваться параметр -p. Для исследования содержимого сжатых файлов может использоваться параметр -z.

Примеры использования

Простое исследование типов файлов

Для простого исследования типов файлов достаточно передать имена этих файлов утилите без использования каких-либо параметров:

$ file splash1280.jpg
splash1280.jpg: JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, progressive, precision 8, 1280x1024, frames 3
$ file audiobook.ogg
audiobook.ogg: Ogg data, Vorbis audio, mono, 24000 Hz, ~40222 bps, created by: Xiph.Org libVorbis I
$ file file1.txt
file1.txt: ASCII text
$ file switchcase.c
switchcase.c: C source, UTF-8 Unicode text
$ file text.txt.bz2
text.txt.bz2: bzip2 compressed data, block size = 900k
$ file debian.patch
debian.patch: unified diff output, UTF-8 Unicode text
$ file /tmp/
/tmp/: sticky, directory
$ file /tmp/.ICE-unix/1558
/tmp/.ICE-unix/1558: socket
$ file /usr/lib/libnetpbm.so.10
/usr/lib/libnetpbm.so.10: symbolic link to libnetpbm.so.10.0

Исследование типов файлов из директории

Утилита file может обрабатывать множества файлов. Для этого достаточно  использовать шаблоны командной оболочки:

$ file *.jpg
nolf228.jpg:    JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, progressive, precision 8, 800x600, frames 3
other:          directory
splash1024.jpg: JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, progressive, precision 8, 1024x768, frames 3
splash1280.jpg: JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, progressive, precision 8, 1280x1024, frames 3

Исследование типов файлов из архива

Утилита может выводить информацию о типе первого файла из архива в случае использования параметра -z:

$ file splash.zip
splash.zip: Zip archive data, at least v2.0 to extract
$ file -z splash.zip
splash.zip: JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, progressive, precision 8, 800x600, frames 3 (Zip archive data, at least v2.0 to extract)