【问题标题】:Get list of applications for opening a specific file获取打开特定文件的应用程序列表
【发布时间】:2015-11-10 15:10:00
【问题描述】:

如何获得能够打开特定文件类型/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)。

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

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

【问题讨论】:

  • 命令“file -i ”有帮助吗?
  • 我不知道。据我所见,我得到一个错误的 MIME 类型一个 SVG 文件 file -i test.svg test.svg: text/html; charset=us-ascii 我也不知道如何获得所需的应用程序列表。
  • 好的,我知道你现在想做什么。尝试查看此文件:/usr/share/applications/defaults.list(对我来说在 Debian/Ubuntu 上)。
  • 我还想要非默认应用程序。这些应用程序不在该文件中。

标签: linux mime-types freedesktop.org xdgutils


【解决方案1】:

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 实际上会忽略它。

【讨论】:

  • 对于application/json,我只得到org.gnome.Builder.desktop,但如果你看上面的截图,还有Atom和Gedit。
  • text/javascripttext/plain 怎么样?似乎是JSON MIME type wasn't standardized in the past,所以也许 GNOME 会退回到不同的类型来处理这些文件。您必须找到 Atom 和 Gedit 的 .desktop 文件,并查看它们声明支持的 MIME 类型。或者,同样可能,我的解决方案毕竟还不够好。
【解决方案2】:

与其按照@MirosławZalewski 的建议编写自己的脚本,不如考虑使用 perl-file-mimeinfo 工具 (ArchWiki link)。

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 选项,长选项--no-ask,不会询问用户使用哪个程序,它选择默认程序或已知的第一个处理文件mimetype的程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多