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

标签 linux mime-types freedesktop.org xdgutils

如何获得能够打开特定文件类型/MIME 类型的应用程序列表?我正在 Linux 上寻找独立于桌面环境的解决方案。

我发现了获取文件 MIME 类型的可能性。

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

然后我可以查询该 MIME 类型的默认应用程序。:

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

是否还有一个解决方案来获取我可用于该文件的程序列表(非默认)?

例如,在 GNOME 桌面上,如果我选择使用另一个应用程序打开 *.json 文件,我可以看到三个(Atom、Gedit、Builder)推荐用于打开该文件的应用程序。 :

GNOME dialog open with another application

如果我选择,显示所有应用程序,我还可以看到进一步关联的应用程序(LibreOffice Writer)。:

GNOME dialog show all applications

我找到了文件/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;

并且还有一个 mime 类型的关联应用程序,但我找不到 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 实际上会忽略它。

关于linux - 获取打开特定文件的应用程序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32059567/

相关文章:

linux - 使用 X11 在 Linux 上获取扫描码而不是键码

在另一个函数上从父级关闭子级

Linux 桌面应用程序 : How can I check a package icon?

regex - 使用 sed 匹配模式并从该行删除到文件末尾

c - 为什么我们要在 wait 之后检查 WIFEXITED 以便在 Linux 系统调用中杀死子进程?

symfony - 文件上传: How to exclude a MIME type using asserts?

java - 通过 Java Android 撰写电子邮件 - 尝试定位设备管理客户端

mime-types - 二维码 MIME 类型

c++ - 国家和语言代码检测

用于访问垃圾文件夹的 Python API