IANA - организация, которая ведёт реестр MIME-типов.
Создадим простой текстовый файл "myfile.kaka".
# С помощью утилиты "file":
file --mime-type myfile.kaka
# myfile.kaka: text/plain
# С помощью "xdg-mime":
xdg-mime query filetype myfile.kaka
# text/plain
# С помощью "gio":
gio info myfile.kaka | grep content-type
# standard::content-type: text/plain
# standard::fast-content-type: application/octet-stream
Скрипт "xdg-mime" под капотом использует утилиту "file".
# папка с MIME-типами:
/usr/share/mime/packages/
~/.local/share/mime/packages/
Теперь создаём файл ~/.magic:
# Содержимое файла ~/.magic:
0 string KAKA! application/x-kaka
!:mime application/x-kaka
Проверяем MIME-тип:
file --mime-type myfile.kaka
# myfile.kaka: application/x-kaka
xdg-mime query filetype myfile.kaka
# application/x-kaka
Проверим, какое у нас дефолтное приложение для типа application/x-kaka
xdg-mime query default application/x-kaka
# ничего не выдало
---
создаём файл ~/.local/share/mime/packages/application-x-kaka.xml:
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-foobar">
<comment>foo file</comment>
<glob pattern="*.kaka"/>
<magic priority="100">
<match type="string" value="KAKA!" offset="0"/>
</magic>
</mime-type>
</mime-info>
Далее обновляем базу MIME:
update-mime-database ~/.local/share/mime
# После выполнения этой команды мой application/x-kaka становится официально зарегестрированным MIME-типом в системе.
# Эта команда читает все XML-файлы из ~/.local/share/mime/packages
# и на их основе перестраивает бинарные кэши (например, ~/.local/share/mime/mime.cache + подкаталоги вроде application/, text/ и т.п.)
Эта команда пересобирает несколько служебных файлов. Среди них:
Теперь я хочу привязать к своему MIME-типу определённое приложение.
# привязываем application/x-kaka к notepadqq:
xdg-mime default notepadqq.desktop application/x-kaka
# Теперь проверяем, какое приложение привязано к нашему MIME-типу:
xdg-mime query default application/x-kaka
# notepadqq.desktop
# Папка с .desktop-файлами:
~/.local/share/applications
/usr/share/applications
# Любая программа при установке кладёт сюда свой .desktop-файл.
# Файл mimeapps.list
~/.config/mimeapps.list
~/.local/share/applications/mimeapps.list
# в этот файл записывается соответствие между notepadqq.desktop и MIME-типом application/x-kaka
# То есть когда я запустил команду "xdg-mime default notepadqq.desktop application/x-kaka", ...
# ... то запись попала в файл ~/.config/mimeapps.list
# ~/.local/share/applications/mimeapps.list - содержит старые записи
Теперь если мы кликнем по файлу myfile.kaka, то он откроется с помощью notepadqq. Или можно попробовать открыть его через терминал вот так:
xdg-open myfile.kaka
# Привязать файловый менеджер PCManFM к папкам:
xdg-mime default pcmanfm.desktop inode/directory
Большинство файловых менеджеров не используют под капотом утилиту "file". Они определяют тип файла по расширению и по файлу ~/.local/share/mime/globs. А потом смотрят в ~/.config/mimeapps.list, чтобы найти программу, которой надо открыть файл.
А вот когда мы используем "file --mime-type" или "xdg-open" (который под капотом использует тот же "file"), то file пытается определить тип файла по сигнатуре и поэтому сначала прочитывает файл ~/.magic, где мы описываем её.
"gio info | grep content-type" будет вести себя примерно также, как PCManFM. Он ориентируется на globs и определяет тип по расширению.