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

Автор: Каспар Клеменс Мирау (Caspar Clemens Mierau)
Перевод: Алексей Бешенов

2008-07-10

Оригинал: «file: classify unknown files on the console», 29 июня 2008 г.

Вам только что прислали письмо с вложениями без пригодных расширений, поэтому вы не знаете, что с ними делать. Это аудио-файлы? PDF? Что же это?.. Похожая проблема возникает после восстановления файлов, с веб-страницами с возможностью загрузки на сервер, и т. д.

Можете, конечно, присвоить файлу расширение и открыть в подходящем, на ваш взгляд, приложении, но лучше, если с этим разберется компьютер. Как пользователь GNU/Linux, вы, должно быть, уже подумали: «Наверняка для этого есть утилита командной строки». Конечно есть: file Яна Дарвина.

Часто эта утилита устанавливается автоматически, исходя из зависимостей. В любом случае, поможет aptitude install file. file зависит от libmagic — пакета с шаблонами для распознания, так называемыми «волшебными числами».

Пусть есть такая директория с неизвестными файлами:

$ ls -l
total 2152
-rw-r--r-- 1 ccm ccm    4118 2008-03-30 06:32 unknown.0
-rw-r--r-- 1 ccm ccm   10220 2008-05-06 02:23 unknown.1
-rw-r--r-- 1 ccm ccm   12693 2008-05-06 02:23 unknown.2
-rw-r--r-- 1 ccm ccm   25933 2007-10-26 07:41 unknown.3
-rw-r--r-- 1 ccm ccm    2121 2007-10-26 07:41 unknown.4
-rw-r--r-- 1 ccm ccm     185 2007-10-14 20:14 unknown.5
-rw-r--r-- 1 ccm ccm 1189011 2008-05-17 22:37 unknown.6
-rw-r--r-- 1 ccm ccm  824163 2008-02-02 05:02 unknown.7
-rw-r--r-- 1 ccm ccm   82367 2007-09-20 06:18 unknown.8
-rw-r--r-- 1 ccm ccm    8872 2006-04-24 12:43 unknown.9

Теперь мы хотим узнать, что внутри этих черных ящиков. Поэтому просто выполняем «file *»:

$ file *
unknown.0: XML
unknown.1: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
unknown.2: ASCII C program text
unknown.3: PDF document, version 1.4
unknown.4: LaTeX 2e document text
unknown.5: perl script text executable
unknown.6: gzip compressed data, from Unix, last modified: Wed Oct  8 16:27:09 2003
unknown.7: Ogg data, Vorbis audio, stereo, 44100 Hz, ~192003 bps, created by: Xiph.Org libVorbis I (1.0)
unknown.8: PNG image data, 492 x 417, 8-bit/color RGBA, non-interlaced
unknown.9: HTML document text

Вот и всё! Впечатляет, да? file не только различает бинарные и текстовые файлы, но даже пытается определить, какой язык программирования использовался. Это не такое уж волшебство: например, в скрипте ZSH первая строчка — «#!/bin/zsh», PDF-файлы обычно начинаются с «%PDF», и так далее. Это всё шаблоны для распознания.

У file есть опции командной строки, которые делают утилиту еще более полезной. Одна из самых любопытных — -i — печатает вместо описаний MIME-типы. Если вы веб-разработчик и хотите узнать точный тип загруженного файла, то file здорово сбережет время:

$ file -i *
unknown.0: text/xml
unknown.1: application/x-object, not stripped
unknown.2: text/x-c; charset=us-ascii
unknown.3: application/pdf
unknown.4: text/x-tex
unknown.5: application/x-perl
unknown.6: application/x-gzip
unknown.7: application/ogg
unknown.8: image/png
unknown.9: text/html

Чудесно, не так ли? Веб-сервер Apache тоже использует в подобных целях libmagic. Собственно, file — это обертка к libmagic.

file давно есть в Debian и Ubuntu.