Использование команды linux ‘file’ для определения типа (т. Е. изображения, аудио или видео)

#bash #shell #file-type

#bash #оболочка #тип файла

Вопрос:

Слово file здесь относится к команде командной строки file, а не к реальным файлам. Я хочу определить, является ли файл, например, видеофайлом ( .mpg , .mkv , .avi ). file довольно хорош при возврате image для файлов изображений, video для видеофайлов и audio для аудиофайлов (и application/x-empty по какой-то причине для текста). Мой вопрос в том, насколько это надежно для идентификации типов. Если бы я сделал простой

 file -ib deliverance.avi | grep video
  

будет ли это работать для всех основных видеофайлов, описанных здесь?

Ответ №1:

Результаты от file далеки от совершенства, и с некоторыми типами файлов возникает больше проблем, чем с другими. Файл в основном просто ищет определенные фрагменты двоичных данных в предсказуемых шаблонах, чтобы определить типы файлов.

К сожалению, в частности, некоторые из типов файлов, часто используемых для видео, попадают в эту «проблемную» категорию. Новые форматы контейнеров, такие как .mp4 и .mkv , обычно имеют несколько разных типов MIME, которые должны должным образом зависеть от типа содержащихся данных. Например, .mp4 может быть правильно идентифицирован как video/mp4 , audio/mp4 или application/mp4 в зависимости от содержимого.

На практике file часто делаются предположения, которые просто соответствуют обычному использованию, и это может отлично сработать для вас. Например, хотя я упоминал некоторые теоретические трудности с правильной идентификацией файлов Matroska, file в основном просто предполагается, что любой файл Matroska является видео. С другой стороны, использование контейнера Ogg более равномерно распределено между аудио и видео, и я полагаю, что текущая версия file просто разделяет разницу и идентифицирует файлы Ogg как application/ogg , которые не попадают ни в одну из ваших категорий.

Единственное, что я могу сказать с уверенностью, это то, что вам нужна самая современная версия file , которую вы можете получить в свои руки. «Волшебные» файлы, содержащие шаблоны для сопоставления и типы MIME, которые будут получены в результате сопоставления, обновляются довольно часто, чтобы включать новые типы файлов, такие как WebM, или просто для повышения точности для старых типов.

Комментарии:

1. Можете ли вы предоставить несколько советов / ссылок о том, как сделать это более точным? Мне пришло в голову, может быть, проверить расширение файла, используя функции PHP. Конечно, такие сайты, как youtube, сталкиваются с этой же проблемой. Спасибо

2. Я не хочу показаться негативным. file вероятно, это примерно то же самое, что вы собираетесь получить. Вы также можете проверить расширение, если хотите убедиться, что некоторые расширения обнаружены определенным образом (или для устранения проблемы, с которой сталкиваетесь на практике).

3. Я провел предварительный тест, и файл был довольно точным. Конечно, будет нелегко получить надежную выборку, скажем, из 25 000 различных видеофайлов.

4. Вы знаете, как крупные сайты решают эту проблему? Возможно, заставить mplayer попытаться воспроизвести это.

5. Это неверно. Команда file не рассматривает «определенные фрагменты двоичных данных в предсказуемых шаблонах для определения типов файлов». Он просматривает первые несколько символов файла, которые в среде unix определяют тип файла. Это также называется магическим числом файлов. Затем таблица магических чисел просматривается в таблице. приведенный ниже ответ frankc является правильным

Ответ №2:

файл работает путем сопоставления заголовка файла с файлом с «магическим числом». Я подозреваю, что лучший способ увидеть, насколько надежен файл, — это проверить ваш локальный файл с магическим номером (возможно, / usr / share / magic, но подробнее см. man file) на наличие типов файлов из вашего списка ссылок.

Ответ №3:

Кажется, что это должно работать для большинства файлов видео / аудио / изображений. Но, если этого не происходит, на самом деле существует файл, который содержит отношения между расширением и его типом:

Информация, идентифицирующая эти файлы, считывается из скомпилированного файла magic /usr/share/magic.mgc или /usr/share/magic, если файл компиляции не существует.

смотрите: http://linux.about.com/library/cmd/blcmdl1_file.htm

Надеюсь, это поможет!