获取打开特定文件的应用程序列表

我如何获得能够打开特定文件types/ MIMEtypes的应用程序列表? 我在Linux上寻找一个独立于桌面环境的解决scheme。

我发现得到一个文件的MIMEtypes的可能性:

~> xdg-mime query filetype test.svg image/svg+xml 

然后我可以查询该MIMEtypes的默认应用程序:

 ~> xdg-mime query default image/svg+xml eog.desktop 

是否还有一个解决scheme来获得我可以用于该文件的程序列表(而不是默认)?

例如,在GNOME桌面上,如果select使用另一个*.json文件的应用程序打开,则可以看到三个(Atom,Gedit,Builder)应用程序build议用于打开该文件。

GNOME对话框打开与另一个应用程序

如果我select,显示所有应用程序,我还可以看到另一个关联的应用程序(LibreOffice Writer):

GNOME对话框显示所有应用程序

我find了文件/home/user/.config/mimeapps.list ,其内容如下:

 [Added Associations] text/html=atom.desktop;firefox.desktop;midori.desktop;org.gnome.gedit.desktop;brackets.desktop; application/javascript=atom.desktop;org.gnome.Builder.desktop;org.gnome.gedit.desktop; 

还有一个MIMEtypes的关联应用程序,但是我找不到在Arch Linux wiki中提到的全局mimeapps.list文件。

GNOME 最可能做的是解析所有的.desktop文件,并寻找这些声明支持所请求的MIME类型的文件。 这是解决您的问题的唯一方法。 通过适当的解析库和低级语言,这应该是相对较快的操作。 另外,他们可能会放一些缓存文件来加快速度。

但是,如果“确定”不是必需的,“可能”对您来说足够好,那么与它们相关联的所有MIME类型和.desktop文件都存储在mimeinfo.cache文件中。 我不知道什么是该文件的实际保证,也许我用错了方式,但下面的功能似乎工作得很好

 #!/bin/bash xdg-all-apps() { LOCAL="${XDG_DATA_HOME:-$HOME/.local/share}/applications/mimeinfo.cache" GLOBAL="/usr/share/applications/mimeinfo.cache" MATCHING="$(grep -h "$1" "$LOCAL" "$GLOBAL")" if [ -z "$MATCHING" ]; then echo "There are no application associated with $1" return fi echo "$MATCHING" |cut -d = -f 2 |\ sed -z -e 's:\n::;s:;:\n:g' |\ sort |uniq } xdg-all-apps text/plain xdg-all-apps audio/mpeg xdg-all-apps image/svg+xml xdg-all-apps application/json 

在我的系统上,运行该代码生成以下输出:

 gvim.desktop kde4-kate.desktop kde4-kwrite.desktop kde4-okularApplication_txt.desktop kwrite-usercreated.desktop libreoffice-writer.desktop vim.desktop easytag.desktop smplayer.desktop smplayer_enqueue.desktop vlc.desktop gimp.desktop inkscape.desktop kde4-kolourpaint.desktop midori.desktop There are no application associated with application/json 

正如你所看到的,一些应用程序提供了多个桌面文件( smplayer.desktopsmplayer_enqueue.desktop )。 这些功能重复可以被删除,但这不是微不足道的。

但是请注意,有些桌面完全忽略了XDG。 如果你真的想要跨桌面的方式,你应该把mailcap文件混合在一起。 我坚信GNOME实际上忽略了它。

不要像@MirosławZalewski所建议的那样编写自己的脚本,可以考虑使用perl-file-mimeinfo工具( ArchWiki链接 )。

perl-file-mimeinfo提供了工具mimeopenmimetype 。 这些接口比它们的xdg-utils等价物有更好的接口:

 # determine a file's MIME type $ mimetype photo.jpeg photo.jpeg: image/jpeg # choose the default application for this file $ mimeopen -d photo.jpeg Please choose an application 1) Feh (feh) 2) GNU Image Manipulation Program (gimp) 3) Pinta (pinta) use application # # open a file with its default application $ mimeopen -n photo.jpeg 

-d选项,长选项--ask-default ,让用户为给定的文件选择一个新的默认程序。
-n选项,long选项--no-ask ,并不要求用户使用哪个程序,而是选择默认程序或已知处理文件mimetype的第一个程序。

在Fedora中,这个包叫做perl-File-MimeInfo
在Debian和Ubuntu中,它被称为libfile-mimeinfo-perl