Linux MIME type

什么是MIME Type

  1. MIME Type是用于描述文件的類型的一種表述方法,其將文件劃分為多種類型蜀漆,方便對其進行統(tǒng)一的管理流码。
  2. MIME Type指定了文件的類型名稱、描述烫沙、圖標信息,同時通過與.desktop應用程序描述文件整合隙笆,指定了文件的打開方式锌蓄。
  3. MIME type是被file manager使用,而不是Gnome或者Ubuntu系統(tǒng)本身撑柔。

以GIMP的.desktop為例說明:

[Desktop Entry]
Version=1.0
Type=Application
Name=GNU Image Manipulation Program
GenericName=Image Editor
Comment=Create images and edit photographs
Exec=gimp-2.7 %U
TryExec=gimp-2.7
Icon=gimp
Terminal=false
Categories=Graphics;2DGraphics;RasterGraphics;GTK;
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=GIMP
X-GNOME-Bugzilla-Component=General
X-GNOME-Bugzilla-Version=2.7.2
X-GNOME-Bugzilla-OtherBinaries=gimp-2.7
StartupNotify=true
MimeType=application/postscript;application/pdf;image/bmp;image/g3fax;image/gif;image/x-fits;image/pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/tiff;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/svg+xml;application/pdf;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;

MimeType字段說明了這個程序支持的MIME types
Exec字段說明了程序的打開方式瘸爽,Exec字段最后的%U或%f很重要,其決定了這個程序時候能顯示在文件管理器的open with清單中铅忿。

參考URL:
http://askubuntu.com/questions/16580/where-are-file-associations-stored
https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html#idm140625828640704
https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
https://specifications.freedesktop.org/desktop-entry-spec/0.9.5/ar01s07.html

誰來決定MIME type的默認程序

  1. mime文件類型描述文件剪决,定義了每個MIME type的特征參數(shù),以及每個何種類型的文件歸屬到這個MIME下
  2. .desktop應用程序描述文件檀训,說明了程序的打開方式柑潦,也指定了其支持的MIME type
  3. mimeinfo.cache 通過抓取.desktop文件的MIME字段信息,將上述兩種描述文件合二為一峻凫,形成一個查詢數(shù)據(jù)庫渗鬼,每個MIME type文件打開時,將通過這個文件尋找打開程序荧琼。
  4. 如果一個MIME type對應到多個.desktop應用程序描述文件譬胎,通過抓取而來的mimeinfo.cache并不能決定誰更優(yōu)先,因為多個.desktop文件之間并沒有優(yōu)先級定義命锄。面對這個場景堰乔,最終的默認程序是由mimeapps.list文件定奪的,其由用戶人工配置累舷,決定同一個MIME type對應多個.desktop程序時,哪個程序優(yōu)先級更高夹孔,更高優(yōu)先級的程序即是族中的默認程序被盈。mimeapps.list在系統(tǒng)中有多個路徑存在,每個路徑的優(yōu)先級是不同的搭伤,修改時需要注意只怎。

Freedesktop標準化

參考URL:
https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-latest.html 重要
https://wiki.archlinux.org/index.php/Default_applications 次要

在舊時代,KDE和GNOME各自為政怜俐,為了在不同的Desktop Manager上統(tǒng)一應用程序打開方法身堡,F(xiàn)reedesktop.org組織定義了多個標準規(guī)范,以實現(xiàn)應用的統(tǒng)一管理:

  • Shared MIME database文件類型描述數(shù)據(jù)庫拍鲤,這個數(shù)據(jù)庫描述了每一個文件類型(MIME type)的參數(shù)特征(名稱贴谎、汞扎、別名、描述擅这、圖標)澈魄,以及滿足何種條件才能將其劃分到對應的MIME類別。

    • MIME type描述文件仲翎,位于/usr/share/mime/packages/(.xml)痹扇,其每一個文件類型(MIME type)的參數(shù)特征(名稱、溯香、別名鲫构、描述、圖標)玫坛,以及滿足何種條件才能將其劃分到對應的MIME類別结笨。
    • 單獨索引每個MIME type描述文件是非常不高效的,所以Freedesktop引入了Shared MIME database昂秃,其是一個靜態(tài)數(shù)據(jù)庫(文本文件/usr/share/mime/mime.cache 此cache文件不建議用戶修改禀梳,可以通過修改上述靜態(tài)數(shù)據(jù)庫,并通過update-mime-database /usr/share/mime/命令更新cache文件)肠骆,描述了每個MIME type的特征算途。初期的數(shù)據(jù)整合了早期KDE和GNOME的文件類型描述信息,并逐步更新蚀腿。
    • 用戶可以自定義自己描述的MIME type描述文件到/usr/share/mime/packages/(.xml)嘴瓤,并通過update-mime-database /usr/share/mime/ 命令更新到數(shù)據(jù)庫文件中。
  • Desktop Entry specification應用程序描述文件(.desktop)莉钙,這個文件描述了系統(tǒng)上安裝的應用程序的參數(shù)特征(名稱廓脆、啟動方法、圖標磁玉、支持的MIME type)停忿。這個描述文件除了用于打開程序外本身、打開MIME type文件的關聯(lián)程序蚊伞,還負責提供給Desktop Manager構建應用程序Menu和索引)

  • mime-apps-spec-1.0關聯(lián)MIME type和application席赂,標準規(guī)定了一個文件可以默認被哪個應用程序(上述Desktop Entry specification定義)打開、如何修改默認打開程序时迫、如何增加刪除MIME type與application的關聯(lián)颅停。

    • 每個應用程序描述文件雖然已經(jīng)指定了各自支持的MIME type,但是如果每次文件打開前都去遍歷一邊所有的描述文件掠拳,執(zhí)行效率將會非常低下癞揉。所以就需要一個關聯(lián)數(shù)據(jù)庫,負責將application(應用程序描述文件)與MIME type(Shared MIME Database)對應起來。這個數(shù)據(jù)庫是一個文本文件靜態(tài)數(shù)據(jù)庫(/usr/share/applications/mimeinfo.cache 此cache文件不建議用戶修改喊熟,可以通過修改每個單獨的.desktop文件柏肪,并通過update-desktop-database /usr/share/mime/命令更新數(shù)據(jù)庫)。
    • 用戶可以自定義應用程序的打開方式到/usr/share/appliacaions(.desktop)逊移,并通過update-desktop-database /usr/share/applications/命令更新到數(shù)據(jù)庫中预吆。

文件默認打開程序優(yōu)先級

參考URL:https://wiki.debian.org/MIME (最終改變了作者對mimeapps.list和mimeinfo.cache的關系的認識,以及整個MIME體系的認識)
update-desktop-database程序通過從每個.desktop文件中抓取其關聯(lián)的MIME type胳泉,并形成mime type與application關聯(lián)數(shù)據(jù)庫拐叉,但是因為是抓取的方式獲得的關聯(lián)關系,如果一個mime type對應有多個application(.desktop)扇商,則mimeinfo.cache數(shù)據(jù)庫是不能分辨出優(yōu)先級的凤瘦。

這時就需要另一個與mimeinfo.cache數(shù)據(jù)庫格式相似的文件mimeapps.list,其負責指定每個mime type在發(fā)生多程序關聯(lián)時案铺,哪個程序優(yōu)先級高蔬芥,mimeapps.list在系統(tǒng)中有多個路徑存在,見下表(文件優(yōu)先級自高到底):

Path Usage
$XDG_CONFIG_HOME/$desktop-mimeapps.list user overrides, desktop-specific (for advanced users)
$XDG_CONFIG_HOME/mimeapps.list user overrides (recommended location for user configuration GUIs)
$XDG_CONFIG_DIRS/$desktop-mimeapps.list sysadmin and ISV overrides, desktop-specific
$XDG_CONFIG_DIRS/mimeapps.list sysadmin and ISV overrides
$XDG_DATA_HOME/applications/$desktop-mimeapps.list for completeness, deprecated, desktop-specific
$XDG_DATA_HOME/applications/mimeapps.list for compatibility, deprecated
$XDG_DATA_DIRS/applications/$desktop-mimeapps.list distribution-provided defaults, desktop-specific
$XDG_DATA_DIRS/applications/mimeapps.list distribution-provided defaults

注意1:mimeapps.list的前身是defaults.list控汉,但是已經(jīng)被廢棄不用了笔诵。參考URL:https://wiki.archlinux.org/index.php/Default_applications
注意2:如果修改了mimeapps.list文件克胳,且更新了數(shù)據(jù)庫緩存尘盼,但是依舊不生效毯辅,就需要看一下修改的文件的優(yōu)先級精耐,有沒有更高級別的文件覆蓋了你的操作。

作者一開始沒有搞清楚整個工作模式時愉棱,是使用strace跟蹤nautilus才發(fā)現(xiàn)的這個問題盾舌。

查看文件的MIME type及其該MIME關聯(lián)的application打開方式:

ray@ray-ThinkPad-X250:~/Desktop$ mimetype topo-WLAN.graphml 
topo-WLAN.graphml: application/yed
ray@ray-ThinkPad-X250:~/Desktop$ gvfs-mime --query application/yed
Default application for 'application/yed': yEd.desktop
Registered applications:
    yEd.desktop
Recommended applications:
    yEd.desktop
ray@ray-ThinkPad-X250:~/Desktop$ 

不建議使用xdg-mime query filetype命令查看MIME打開方式走趋,其通過/usr/share/mime/目錄下的文件決定輸出內(nèi)容沐旨,如果mime-type是通過alias定義的森逮,沒有實際的文件,則查找失敗磁携。
gvfs-mime雖然也是讀取/usr/share/mime目錄下的文件褒侧,但是它可以識別出alias,雖然有時候也是不準確R昶C乒!

自定義MIME TYPE鳞上,并指定打開程序

參考URL:
https://wiki.archlinux.org/index.php/Default_applications
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Desktop_Migration_and_Administration_Guide/File_Formats.html

  1. 自定義MIME TYPE
    icon 自定義:
    http://techmonks.net/how-to-add-a-custom-filetype-to-linux/
    https://help.ubuntu.com/community/AddingMimeTypes
    https://wiki.archlinux.org/index.php/Icons
    Linux 的icons也分為很多種類这吻,專門的icon theme都會分類到指定的icon類別(不同的目錄)吊档,mimetypes也是專門的目錄篙议。
    用戶自己創(chuàng)建的mimetypes icons存放在~/.local/share/icons目錄的子目錄mimetypes下:
ray@ray-ThinkPad-X250:~/.local/share/icons$ ls -al ~/.local/share/icons/hicolor/32x32/mimetypes/
total 12
drwx------ 2 ray ray 4096 Feb 28 12:32 .
drwx------ 4 ray ray 4096 Feb 28 12:32 ..
lrwxrwxrwx 1 ray ray    7 Feb 28 12:32 gnome-mime-yEd.png -> yEd.png
-rw------- 1 ray ray 1922 Feb 28 12:32 yEd.png
ray@ray-ThinkPad-X250:~/.local/share/icons$ ls -al ~/.local/share/icons/hicolor/32x32/apps
total 12
drwx------ 2 ray ray 4096 Feb 26 16:30 .
drwx------ 4 ray ray 4096 Feb 28 12:32 ..
-rw------- 1 ray ray 1350 Feb 26 16:30 chrome-coobgpohoikkiipiblmjeljniedjpjpf-Default.png
ray@ray-ThinkPad-X250:~/.local/share/icons$ 

配置自定義mime icon步驟如下:

  • 尋找一個png文件,并確定其尺寸大小。(文件屬性可以看到)
  • 不用復制文件到上述mimetypes icon目錄鬼贱,使用如下命令實現(xiàn):
xdg-icon-resource install --size 32 --context mimetypes yEd.png
  1. 更新MIME數(shù)據(jù)庫
sudo update-mime-database /usr/share/mime
  1. 配置.desktop文件關聯(lián)MIME TYPE
ray@ray-ThinkPad-X250:~/.local/share/applications$ sudo vim ~/.local/share/applications/yED.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Type=Application
Name=yEd Graph Editor
Exec=/bin/sh "/home/ray/Applications/yEd/yEd" %f
Icon=/home/ray/Applications/yEd/.install4j/yEd.png
Categories=Player;
MimeType=application/yed;
  1. 更新.desktop文件與MIME TYPE關聯(lián)數(shù)據(jù)庫
$ update-desktop-database ~/.local/share/applications
image.png
image.png

thunderbird下的MIME

參考URL:http://kb.mozillazine.org/Actions_for_attachment_file_types

通過strace可以發(fā)現(xiàn)Thunderbird調(diào)用了/etc/mailcap和/etc/mime.types文件(有限調(diào)用用戶目錄下的~/.mimetypes文件)決定文件的打開方式移怯,這兩個文件是通過update-mime命令更新維護的,區(qū)別與前邊的update-mime-database这难。

正常情況下thunderbird與系統(tǒng)文件系統(tǒng)的標準MIME配置是一樣的舟误,可以正確的識別文件的MIME類型并對應打開程序。

但是thunderbird的MIME類型判斷不完全是通過擴展名來檢測的姻乓,thunderbird使用郵件系統(tǒng)的正文(源代碼)指定的MIME類型和附件的擴展名聯(lián)合來尋找關聯(lián)的application嵌溢,正常情況下也是沒有問題的,但是蹋岩。赖草。。剪个。秧骑。】勰遥總有一些不守規(guī)矩的郵件內(nèi)容(尤其是一些垃圾第三方郵件客戶端)乎折,會指定錯誤的MIME類型,比如將xls和xlsx混淆關聯(lián)侵歇,所以將會導致thunderbird判斷不出文件的MIME類型骂澄,進而無法提供默認的application,所以會經(jīng)澈兄粒看到默認的gedit程序總是被“寵幸”作為last backup酗洒。

目前還沒有找到好的辦法解決這個問題,隨后再研究吧枷遂。
2016.08.03 找到兩個之前版本靠譜的Thunderbird Add-on:

OPENATTACHMENTBYEXTENSION
根據(jù)文件擴展名來選擇打開的程序樱衷,可以解決Thunderbird下的問題,但是最新版本測試結果是中文文件打開還是有問題酒唉,charset設備為gb2312也是不可以的矩桂。
Gnome Open或OpenX
要求DM必須是GNOME,通過調(diào)用gnome-open程序讓Nautilus來判斷文件類型痪伦,并選擇合適的打開方式侄榴。它會生成一個新的MIME分類到thunderbird,名字是"application/gnomeopen"网沾,強制指定通過/usr/bin/gnome-open程序打開癞蚕。再通過插件Overlay的方式替換掉thunderbird處理附件的JS腳本,修改腳本打開附件的方法固定使用"applicaiton/gnomeopen"這個MIME辉哥。測試結果是已經(jīng)失效桦山,應該是JS腳本因為版本升級發(fā)生了變化攒射,自己嘗試修改也未果。

最終的可用的方法是恒水,通過Gnome Open插件帶來的靈感会放,在unknow文件打開時,選擇打開方式為/usr/bin/gnome-open钉凌,簡化操作咧最。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市御雕,隨后出現(xiàn)的幾起案子矢沿,更是在濱河造成了極大的恐慌,老刑警劉巖酸纲,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咨察,死亡現(xiàn)場離奇詭異,居然都是意外死亡福青,警方通過查閱死者的電腦和手機摄狱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來无午,“玉大人媒役,你說我怎么就攤上這事∠艹伲” “怎么了酣衷?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長次泽。 經(jīng)常有香客問我穿仪,道長,這世上最難降的妖魔是什么意荤? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任啊片,我火速辦了婚禮,結果婚禮上玖像,老公的妹妹穿的比我還像新娘紫谷。我一直安慰自己,他們只是感情好捐寥,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布笤昨。 她就那樣靜靜地躺著,像睡著了一般握恳。 火紅的嫁衣襯著肌膚如雪瞒窒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天乡洼,我揣著相機與錄音崇裁,去河邊找鬼陵像。 笑死,一個胖子當著我的面吹牛寇壳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妻怎,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壳炎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逼侦?” 一聲冷哼從身側響起匿辩,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榛丢,沒想到半個月后铲球,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡晰赞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年稼病,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掖鱼。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡然走,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戏挡,到底是詐尸還是另有隱情芍瑞,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布褐墅,位于F島的核電站拆檬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妥凳。R本人自食惡果不足惜竟贯,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逝钥。 院中可真熱鬧澄耍,春花似錦、人聲如沸晌缘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磷箕。三九已至选酗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岳枷,已是汗流浹背芒填。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工呜叫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殿衰。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓朱庆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闷祥。 傳聞我的和親對象是個殘疾皇子娱颊,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Ubuntu的發(fā)音 Ubuntu悟衩,源于非洲祖魯人和科薩人的語言剧罩,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,269評論 9 467
  • tl;dr Linux下程序運行狀態(tài)記錄軟件建議使用ulogme,而不是arbtt!!!目錄 文章起源 arbtt...
    mst7閱讀 3,319評論 2 5
  • 修改默認打開程序 多種方法: 使用系統(tǒng)Details程序修改( System > Details > Defaul...
    mst7閱讀 2,440評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挑势,服務發(fā)現(xiàn)舰罚,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 那是一個好久好久的夢了薛耻,好像在五月营罢,夕陽會從這座杜鵑正開得火烈的山后落下,兩個無意的人饼齿,也將在這赴一場未知的約饲漾。 ...
    莫琉J閱讀 239評論 0 0