Как добавить новый тип mime для файла -i?

.*в шаблоне регулярного выражения является жадным, он соответствует максимально возможной длине строки, поэтому совпадающие кавычки будут последними.

Поскольку разделителем здесь является только один символ, мы можем использовать группу перевернутых квадратных скобок для соответствия чему угодно, кроме кавычек, т. е. [^"], а затем повторять это для соответствия ряду символов, которые не являются кавычками.

$ echo '... "foo"... "bar"...' | sed 's/[^"]*"\([^"]*\)".*/\1/'
foo

Другой способ — просто удалить все до первой кавычки, а затем удалить все, начиная с (новой )первой кавычки:

$ echo '... "foo"... "bar"...' | sed 's/^[^"]*"//; s/".*$//'
foo

В регулярных выражениях Perl спецификаторы *и +можно сделать не -жадными, добавив знак вопроса, поэтому .*?будет что угодно, но как можно меньше символов/байтов.

3
22.07.2019, 20:24
2 ответа

Краткий ответ:

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. ].

В заключение, чтобы получить желаемые результаты, я рекомендую:

  1. Перекомпилируйте новую версию fileиз исходного кода -edge и
  2. Используйте флаги:file -b -e cdf --mime-typeвместо file -bi.
1
27.01.2020, 21:29

Чтобы файл знал об этом, вам нужно записать магический номер, хранящийся в начале файла, в /etc/magic. Справочная страница для «файла» описывает способ работы этого файла, а справочная страница для «волшебства» описывает синтаксис для использования в магическом файле.

0
27.01.2020, 21:29

Теги

Похожие вопросы