文件关联存储在哪里?

Ubuntu或其他Linux系统如何存储文件关联?
是否有一些“/etc/asscociations”文件之类的东西?
我知道我可以右键单击文件并通过“打开方式”更改它,但我只是好奇它是如何在内部存储的。
11个回答

文件管理器(默认为Nautilus)使用文件的MIME类型来确定打开它的程序。 当安装应用程序时,它可以指定它可以打开哪些MIME类型以及在放置在/usr/share/applications中的.desktop文件中用于打开文件的命令。这是用于菜单、桌面快捷方式等的文件。 例如,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类型。 Exec字段告诉系统使用命令gimp-2.7 %U,将'%U'替换为要打开的文件。(注意GIMP 2.7是我从PPA安装的版本,因此比Ubuntu存储库中的当前版本更高)。
当应用程序包安装时,系统会将此MIME类型数据提取到一个更易于访问的数据库中,因为如果每次打开文件时都要查找每个.desktop文件,这将花费太长时间。
这告诉系统可以用于该MIME类型的应用程序,并在“打开方式”列表中提供这些应用程序。默认值在其他地方定义。文件/usr/share/applications/defaults.list提供了系统默认值的信息。除非您另有选择,否则在“打开”文件时将使用这些应用程序。

8更改/usr/share/applications中的.desktop文件中的MIME类型后,是否有命令可以重新创建MIME数据库以查看新的关联生效? - Redsandro
12是的。sudo update-desktop-database 请参考 http://jarrpa.net/2011/10/28/creating-custom-url-handlers-in-ubuntu-11-04-11-10-gnome-3-0/ - NoBugs
本地更改的更合适位置是/usr/local/share/applications。我认为gtk默认也会在那里查找。在我的系统上确实如此,但它自Ubuntu 7.04以来已经升级(而不是重新安装)。 - Peter Cordes
2Ubuntu似乎遵循freedesktop.org:http://standards.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.1.html,这是一个非常棒的项目。 - Ciro Santilli OurBigBook.com
1就我所知,我不得不使用sudo update-desktop-database ~/.local/share/applications/,因为.desktop文件是本地的。 - Michael
或许可以补充一下,用户特定的信息存储在~/.local/share/applications/defaults.list文件中。 - DarkTrick
每次我运行qtfm时,它都会覆盖~/.local/share/applications/mimeapps.list文件。我在任何地方都找不到defaults.list文件。我已经删除了所有我能找到的mimeinfo.cache文件,但它们并没有重新生成。我确认了/usr/share/applications/mupdf.desktop条目具有application/pdf MIME类型。我已经重新生成了数据库。我没有/usr/local/share/applications目录。我甚至看不到qtfm从哪里获取它的默认设置,但当它应该支持mimeapps.list时,我不明白"支持"怎么会涉及覆盖用户偏好设置。 - NeilG

为了补充dv3500ea的出色回答,我想添加一些关于更改关联时会发生什么的信息。
默认情况下,defaults.list(可以通过键入“locate defaults.list”找到)提供了与每个MIME类型相关联的应用程序列表,您所做的任何自定义都存储在您的主目录中的~/.local/share/applications/mimeapps.list中。因此,如果您添加或删除关联,或更改默认关联,则会更新此文件。
GNOME桌面系统管理指南http://library.gnome.org/admin/system-admin-guide/stable/似乎没有讨论mimeapps.list,但我在http://live.gnome.org/SysAdminGuideUpdate上找到了以下描述:

mimeapps.list位于$XDG_DATA_DIRS/applications中。它的目的是向应用程序添加或删除mime关联。当用户在“打开方式”对话框中进行更改时,nautilus会写入~/.local/share/applications/mimeapps.list。


1但是在使用Ubuntu 12.04时,我意识到mimeapps.listdefaults.list中的条目覆盖了。 - feeela
1在14.04版本中,我能够在~/.local/share/applications/mimeapps.list文件中将s/vlc/mplayer/进行替换,并且运行中的进程如pcmanfm可以在不重启的情况下应用这些更改。(mplayer.desktop只是运行mplayer的一个快捷方式。我猜这是因为我之前在/usr/local安装了旧版mplayer时留下的一个文件。我不确定是否需要MimeType=list;这一行。) - Peter Cordes
1更准确地说,mimeapps.list 可以位于以下搜索路径的任何位置:https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.1.html - Ciro Santilli OurBigBook.com
我发现qtfm无情地覆盖了~/.local/sahre/applications/mimeapps.list,而不管我做了什么 :-(。QtFM的发布说明称此为“支持”。 - NeilG

我发现在我的系统(Debian Jessie)上也有一个~/.config/mimeapps.list,其中有一个我意外创建的关联,用gedit打开特定文件类型。没有任何标准的纠正方法(默认应用程序设置,Thunar的“打开方式”属性)反映了这一点,但gedit是默认应用程序。
我能够从~/.config/mimeapps.list中删除该行,现在正确的应用程序打开了该文件。

3谢谢,你无意中帮助我解决了Firefox打开所有东西都在Gedit中的问题。在openSUSE 13.2上,我删除了包含"application/octet-stream=org.gnome.gedit.desktop;"的那一行。 :) - user31389
4自Ubuntu 15.04起,用户特定的修改也存储在~/.config/mimeapps.list中。 - DJCrashdummy
4更准确地说,mimeapps.list 可以出现在以下搜索路径的任何位置:https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.1.html - Ciro Santilli OurBigBook.com

我能够像这样设置一个关联:
xdg-mime default xnview.desktop image/jpeg

你还可以删除关联和做其他事情:man xdg-mime 我不需要运行sudo update-desktop-database

感谢您提供这个答案。我原以为它可能会解决我的问题,即qtfm覆盖了~/.local/share/applications/mimeapps.list,但不幸的是,无论mimeapps.list中是否有条目,xdg-mime query default application/pdf仍然显示mupdf.desktop,而且qtfm仍然覆盖了我的mimeapps.list,并不遵守xdg-mime的设置。我想知道qtfm读取默认值的其他位置在哪里? - NeilG

在Ubuntu 18.04上,我发现优先顺序如下,从强到弱:
  1. ~/.local/share/applications/defaults.list
  2. /usr/share/applications/defaults.list
  3. ~/.config/mimeapps.list("使用其他应用程序打开"将更新此文件)
  4. ~/.local/share/applications/mimeapps.list
  5. 在兼容应用程序的mimeinfo.cache注册表中找到的第一个匹配项,这些匹配项是从/usr/share/applications/usr/local/share/applications中的.desktop文件生成的,并且可以使用update-desktop-database重新生成。
  6. (从未使用)/etc/gnome/defaults.list

1我注意到在/usr/share/applications/defaults.list文件中,一行上有几个条目,但只有第一个应用程序会显示为打开文件的默认选项(如果没有被覆盖的话)。我不知道其他的为什么会出现在那里。 - Alex Martian
2似乎"strongest"意味着更高级别,AFAIK(据我所知)~/.config/mimeapps.list会覆盖/usr/share/applications/defaults.list - Alex Martian
感谢提供额外的信息。我的~/.config/mimeapps.list中确实有(更好的)信息,但qtfm不尊重它,并且仍然从某个其他神秘位置覆盖了~/.local/share/applications/mimeapps.list - NeilG

我找到了这个关于默认关联的链接,可能会有帮助。 https://wiki.archlinux.org/index.php/Default_Applications
全局关联:
/usr/share/applications/mimeapps.list

每个用户关联:
~/.local/share/applications/mimeapps.list

语法如下:
[Added Associations]
mimetype=desktopfile1;desktopfile2;...;desktopfileN
...
[Removed Associations]
mimetype=desktopfile1;desktopfile2;...;desktopfileN
[Added Associations] 部分用于指定首选(默认)应用程序,按照偏好递减的顺序。这意味着 desktopfile1 是最受欢迎的,而 desktopfileN 是最不受欢迎的。
[Removed Associations] 部分用于明确删除任何先前继承的关联。

2这是来自一个archlinux网站的信息,不一定适用于Ubuntu系统,/usr/share/applications/mimeapps.list文件不存在。 - guntbert
1谢谢你指出这一点,不过用户说在Ubuntu或其他Linux系统中也是可以的,这意味着这也是对他问题的一个答案 :P。 - IdontCareAboutReputationPoints
6如果将mimeapps.desktop替换为defaults.desktop,这个答案就完全可以。 - szx

~/.local/share/applications中创建一个名为truecrypt.desktop的文件,并添加以下内容:
[Desktop Entry]
Encoding=UTF-8
Type=Application
Icon=
Exec=/usr/bin/truecrypt %U
Name=truecrypt
Comment=manage truecrypt volumes

然后编辑文件~/.local/share/applications/mimeapps.list,并添加以下行:
application/octet-stream=truecrypt.desktop

我通过运行以下命令找到了Truecrypt的MIME类型:
file --mime-type -b <any truecrypt filename>

很好的答案,因为它适用于那些使用KDE但同时也有一些GTK本地程序(比如Firefox)的人。 - naught101

mimeapps.list搜索路径

其他人已经提到了这个文件,但没有精确解释它的位置。

freedesktop.org标准在https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.html中说明:

此文件的查找顺序如下:
位置 用途 $XDG_CONFIG_HOME/$desktop-mimeapps.list 用户覆盖,桌面特定(高级用户) $XDG_CONFIG_HOME/mimeapps.list 用户覆盖(用户配置GUI的推荐位置) $XDG_CONFIG_DIRS/$desktop-mimeapps.list 系统管理员和ISV覆盖,桌面特定 $XDG_CONFIG_DIRS/mimeapps.list 系统管理员和ISV覆盖 $XDG_DATA_HOME/applications/$desktop-mimeapps.list 为完整性而保留,已弃用,桌面特定 $XDG_DATA_HOME/applications/mimeapps.list 为兼容性而保留,已弃用 $XDG_DATA_DIRS/applications/$desktop-mimeapps.list 发行版提供的默认值,桌面特定 $XDG_DATA_DIRS/applications/mimeapps.list 发行版提供的默认值
然后给出了这些环境变量的默认值,链接在https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html
  • $XDG_DATA_HOME: $HOME/.local/share
  • $XDG_CONFIG_HOME: $HOME/.config
  • $XDG_DATA_DIRS: 无,追加到XDG_DATA_HOME
  • $XDG_CONFIG_DIRS: 无,追加到XDG_CONFIG_HOME

旧版本的Ubuntu可能不会检查~/.config,所以请确保您也尝试~/.local/share

类似以下命令:

 xdg-settings set default-web-browser chromium-browser.desktop
 xdg-settings get default-web-browser

会自动编辑这些文件。

对于所有用户:

/usr/share/applications/defaults.list

每个用户都有一个配置文件,用于覆盖这些默认设置:

~/.config/mimeapps.list

请参考https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.1.html,了解可能用于覆盖默认设置的位置。
您必须知道要更改关联的文件的 MIME 类型。
此外,所有关联都可以在命令行中处理和更改:

xdg-mime


Freedesktop.org(以前称为X桌面组,因此有“XDG”缩写)是目前推动X标准的团体,可以在这里了解更多(请参阅维基百科)。

warvariuc的回答已经提到了xdg-mime的使用方法,例如:

xdg-mime default xnview.desktop image/jpeg

 

经过与图像编辑器和查看器的多次尝试,我最终得到了针对不同图像类型的不同查看器,几乎没有一致性,特别是在较罕见的图像类型中。
我将上述命令分配给由图像查看器控制的每个MIME类型,然后通过克隆其中一个来创建一个新的image-viewer.desktop文件(这是可选项,您可以简单地重用您喜欢的)。接下来,我手动验证了我的新首选应用程序与所有其他应用程序的MIME类型都不会不兼容。最后,我将该应用程序设置为所有其他应用程序的默认MIME类型。
sed '/^MimeType=/!d; s///; s/;/\n/g' \
  /usr/share/applications/{ristretto,geeqie,gthumb}.desktop |sort -u \
  |xargs xdg-mime default image-viewer.desktop

这个脚本会检查每个查看器(在我的情况下是RistrettoGeeqieGThumb)的.desktop文件,提取MIME定义(以MimeType=开头,然后包含一个分号分隔的列表),删除(之前匹配的)前缀标签,并将列表拆分为每行一个条目。sort -u然后删除重复的行,然后将它们传递给xdg-mime来设置新的默认值。
(如果你想在实际运行之前测试一下,请将xargs更改为xargs echo,它会打印出结果命令而不是运行它。)
这个技巧适用于你想要为目标应用程序重新获取的任何内容。你甚至不需要创建一个新的.desktop文件(可以使用现有的文件)。我做了这个额外的步骤,这样当我不可避免地在图像预览器之间改变我的忠诚时,我只需要更改那个文件即可。