Получить список приложений для открытия определенного файла

Как я могу получить список приложений, которые способны открывать определенный тип файла / 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, открытый с другим приложением

Если я выберу, покажу все приложения, я также смогу увидеть другое связанное приложение (LibreOffice Writer).:

Диалог GNOME показать все приложения

Я нашел файл /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;

а также имеет связанные приложения для типа пантомимы, но я не могу найти глобальный mimeapps.list файл, который упоминается в Arch Linux wiki.

2 ответа

Скорее всего, 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.desktop а также smplayer_enqueue.desktop). Эти функциональные дубликаты могут быть удалены, но это не тривиально.

Но учтите, что некоторые рабочие столы полностью игнорируют XDG. Если вы хотите по-настоящему кросс-настольный способ, вы должны поставить mailcap файлы где-то в миксе. Я твердо верю, что GNOME фактически игнорирует это.

Вместо того, чтобы писать свой собственный скрипт, предложенный @MirosławZalewski, рассмотрите возможность использования инструмента perl-file-mimeinfo ( ссылка ArchWiki).

perl-file-mimeinfo предоставляет инструменты mimeopen а также mimetype, Они имеют немного более приятный интерфейс, чем их 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.

Другие вопросы по тегам