2015-08-17 28 views
5

Jak uzyskać listę aplikacji, które mogą otwierać określony typ pliku/typ MIME? Szukam rozwiązania niezależnego od środowiska komputerowego w systemie Linux.Wyświetl listę aplikacji do otwierania określonego pliku

znalazłem uwzględnieniem możliwości uzyskać typ MIME dla pliku .:

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

Wtedy mógłbym zapytać o domyślnej aplikacji dla tego typu MIME .:

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

Jest tam również rozwiązanie, aby uzyskać listę programów (nie domyślnych), których mogę użyć dla tego pliku?

Na przykład na GNOME, jeśli wybiorę otwarty z innej aplikacji do *.json pliku, widzę trzy (Atom, Gedit, Builder) aplikacji, które są zalecane do otwierania pliku .:

GNOME dialog open with another application

Jeśli wybiorę, pokaż wszystkie aplikacje, mogę również zobaczyć dalsze powiązanej aplikacji (LibreOffice Writer) .:

GNOME dialog show all applications

znalazłem plik /home/user/.config/mimeapps.list który ma treści, takie jak:

[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; 

a także został powiązany aplikacje dla typu MIME, ale nie mogę znaleźć globalne mimeapps.list plik, który jest wymieniony w Arch Linux wiki.

+0

Czy polecenie "file -i " jest pomocne? – crafter

+0

Nie wiem. O ile widzę, otrzymuję nieprawidłowy typ MIME pliku SVG 'file -i test.svg test.svg: text/html; charset = us-ascii' Również nie wiem, jak zdobyć żądaną listę aplikacji. –

+0

OK, widzę, co chcesz teraz zrobić. Spróbuj spojrzeć na ten plik: /usr/share/applications/defaults.list (dla mnie w Debianie/Ubuntu). – crafter

Odpowiedz

5

Co GNOME najprawdopodobniej robi parsowanie wszystkich plików .desktop i poszukiwanie tych, które deklarują wsparcie dla żądanego typu MIME. To jedyny sposób na rozwiązanie twojego problemu. Z odpowiednimi bibliotekami parsowania i językiem niższego poziomu, powinna to być względnie szybka operacja. Dodatkowo mogą umieszczać niektóre pliki pamięci podręcznej, aby przyspieszyć dalszy rozwój.

Ale jeśli "pewne" nie jest wymagane i "prawdopodobnie" jest wystarczająco dobre dla ciebie, to wszystkie powiązane z nimi typy MIME i pliki .desktop są przechowywane w plikach mimeinfo.cache. Nie jestem pewien, co jest rzeczywistą gwarancją tego pliku i może Używam go w niewłaściwy sposób, ale następująca funkcja wydaje się działać dobrze

#!/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 

W moim systemie, uruchomiony ten kod generuje następujące wyjścia:

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 

Jak widać, niektóre aplikacje udostępniają więcej niż jeden plik pulpitu (smplayer.desktop i smplayer_enqueue.desktop). Te funkcjonalne duplikaty można usunąć, ale to nie jest banalne.

Należy jednak pamiętać, że niektóre komputery ignorują XDG. Jeśli chcesz naprawdę na okrągło, powinieneś umieścić pliki mailcap gdzieś w miksie. Głęboko wierzę, że GNOME faktycznie to ignoruje.

+0

Dla 'application/json' dostaję tylko' org.gnome.Builder.desktop', ale jest też Atom i Gedit, jeśli spojrzysz na powyższy zrzut ekranu. –

+1

Co z 'text/javascript' i' text/plain'? Wygląda na to, że [typ JSON MIME nie był standaryzowany w przeszłości] (http://stackoverflow.com/questions/477816/what-is-the-correct-json-content-type), więc może GNOME wraca do różnych typy do obsługi tych plików. Będziesz musiał znaleźć pliki .desktop Atom i Gedit i zobaczyć, jakie typy MIME deklarują, że obsługują. Albo, równie prawdopodobne, moje rozwiązanie w końcu nie jest wystarczająco dobre. –

0

Zamiast pisania własnego skryptu sugerowanego przez @ MirosławZalewskiego, rozważ użycie narzędzia perl-file-mimeinfo (ArchWiki link).

perl-file-mimeinfo dostarcza narzędzi mimeopen i mimetype. Mają one nieco ładniejszy interfejs niż ich odpowiedniki 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 

Opcja -d, długi opcję --ask-default, pozwala użytkownikowi wybrać nowy domyślny program dla podanych plików.
Opcja -n, długa opcja --no-ask, nie pyta użytkownika, którego programu użyć, wybiera program domyślny lub pierwszy program znany z obsługi typu MIME pliku. Ten pakiet nazywa się .
W Debianie i Ubuntu nosi nazwę libfile-mimeinfo-perl.