#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
Надеюсь, это поможет!