curl -Ls https://git.io/fj9xx > ole2compounddocs
file -m ole2compounddocs -e cdf -b --mime-type file.pub
application/vnd.ms-publisher
Сначала (для потомков, некоторая предыстория):
Утилита file
(, то есть реализация, используемая сегодня в большинстве систем ), представляет собой команду Яна Дарвина "Fine Free File Command" (В некоторых менеджерах пакетов она называется file
; в других она называется libmagic
. Команда file
является оболочкой утилиты CLI libmagic
. По сути, это одно и то же.
Сама библиотека libmagic
обычно опирается на «базу данных» (сжатый составной список, обычно называемый «magic.mgc», установленный в разных местах в зависимости от ОС )«магических» файлов, содержащих регулярное выражение. и другие шаблоны, которые библиотека может использовать, определяя «тип» неизвестных файлов (или потоков данных )из образцов необработанных двоичных файлов.
Тип файла определяется по списку различных критериев, основанных на внутренних правилах, имени/расширении (файла, если таковое имеется ), «основном» сжатом магическом файле и любых магических файлах, добавленных по команде строка с флагом -m
.
Инструмент должен найти баланс между «типом» файла и содержащейся в нем информацией. Во многих случаях расширение файла не имеет большого значения, но в некоторых; Возьмем, к примеру, классический случай файла.zip и файла.jar. Оба являются «zip-файлами», т. е. представляют собой файлы, сжатые с помощью спецификации Info -Zip. В этом случае расширения файла должно быть достаточно, чтобы понять, что это исполняемый файл Java, а не просто zip-архив. Однако с расширением «.pub» Microsoft Publisher это не имеет большого значения, поскольку наиболее распространенное использование «.pub» на платформах *nix — это открытые ключи SSH.
Еще больше усложняет ситуацию тот факт, что Microsoft использует несколько различных версий своих форматов «Связывание и внедрение объектов (OLE )» в своих архивах «Compound Document File» для несметного числа очень разные приложения.Сами по себе они обычно представляют собой заархивированные XML-файлы. Все это приводит к довольно сложной (и дорогостоящей в вычислительном отношении )логике для детализации нескольких двоичных форматов/форматов сжатия, чтобы можно было отличить документ «Издатель» от, скажем, базы данных Microsoft Outlook.
Наконец, важно отметить, что типы MIME (технически, медиа-типы IANA)общеизвестно являются ненадежными маркерами «расположения контента» именно по указанным выше причинам, а также потому, что многие разработчики не утруждают себя зарегистрируйте свои типы «поставщика»(vdn.xxxxxxx
):, хотя Microsoft зарегистрировала множество типов носителей,application/vnd.ms-office
(которые file
использует для файлов CDF/CDF2 ), не зарегистрированы, как и application/ms-publisher
. На самом деле файл mime.types
никогда не проверяется libmagic, и его существование не является стандартным на большинстве платформ. Вместо этого типы MIME просто жестко закодированы в «магических» файлах, а application/vnd.ms-publisher
был добавлен совсем недавно.
Также важно отметить, что функциональность флага -i
часто сильно отличается от ожидаемого, и он работает по-разному в разных версиях file
или может вообще не существовать. Однако, в целом, его целью является машиночитаемость и (что важно ), в некоторых версиях он изменяет эвристику в пользу более релевантных для машины -результатов. Таким образом, в некоторых версиях file
и его базы данных вы получите результат от file -bi
, который представляет собой просто :application/octet-stream; charset=binary
(, который является допустимым, не -MIME-типом поставщика )вместо application/vnd.ms-office
. И если он возвращаетapplication/vnd.ms-office
(CDF ), он требует, чтобы флаги -e cdf
эффективно «пропускали» этот результат, потому что (предположительно )больше подходит для другой программы/алгоритма, который может читать файлы CDF. чем тот факт, что это файл Publisher.Игнорирование результата CDF для продолжения поиска и получения любых идентификаторов ODF2 и их MIME-типов требует значительно больших вычислительных ресурсов — результат application/vnd.ms-office
требует шести операций магического теста, а application/vnd.ms-publisher
требует сотен или тысяч (, как вы можете видеть. это с флагом -d
). Еще одна причина, по которой лучше избегать-i
:в большинстве новых версий file
, этот флаг возвращает кодировку MIME, а также тип MIME, поэтому лучше использовать --mime-type
, если вы не хотите, чтобы результат был application/vnd.ms-publisher; charset=binary
. ].
В заключение, чтобы получить желаемые результаты, я рекомендую:
file
из исходного кода -edge и file -b -e cdf --mime-type
вместо file -bi
.