2015-08-17 18 views
5

Come posso ottenere un elenco di applicazioni in grado di aprire un tipo di file/tipo MIME specifico? Sto cercando una soluzione indipendente per desktop-environment su Linux.Ottieni un elenco di applicazioni per l'apertura di un file specifico

ho trovato il possibilty per ottenere il tipo MIME di un file .:

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

Poi ho potuto interrogare per l'applicazione predefinita per quel tipo MIME .:

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

C'è anche una soluzione per ottenere una lista di programmi (non di default) che posso usare per quel file?

Ad esempio, su un desktop GNOME, se scelgo aperto con un'altra applicazione per *.json di file, posso vedere tre (Atom, Gedit, Builder) le applicazioni che sono raccomandati per l'apertura del file .:

GNOME dialog open with another application

Se scelgo, mostrare tutte le applicazioni, posso anche vedere un ulteriore applicazione associata (LibreOffice Writer) .:

GNOME dialog show all applications

ho trovato il file /home/user/.config/mimeapps.list che ha contenuti come:

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

ed anche ha associato le domande di tipo MIME, ma non riesco a trovare un file globale mimeapps.list che è menzionato nel Arch Linux wiki.

+0

Il comando "file -i " aiuta? – crafter

+0

Non lo so. Per quanto posso vedere, ottengo un tipo MIME errato in un file SVG 'file -i test.svg test.svg: text/html; charset = us-ascii' Inoltre non so, come ottenere l'elenco delle applicazioni desiderate. –

+0

OK, vedo cosa vuoi fare ora. Prova a guardare questo file: /usr/share/applications/defaults.list (su Debian/Ubuntu per me). – crafter

risposta

5

Ciò che GNOME molto probabilmente analizza tutti i file .desktop e cerca quelli che dichiarano il supporto per il tipo MIME richiesto. Questo è l'unico modo certo per risolvere il tuo problema. Con le librerie di analisi corrette in uso e il linguaggio di livello inferiore, questa operazione dovrebbe essere relativamente veloce. Inoltre, possono mettere alcuni file di cache per accelerare ulteriormente le cose.

Ma se "certo" non è richiesto e "probabilmente" è abbastanza buono per te, tutti i tipi MIME e i file .desktop associati sono memorizzati nei file mimeinfo.cache. Non sono sicuro che cosa è la garanzia effettiva di quel file e forse sto usando nel modo sbagliato, ma in seguito la funzione sembra funzionare bene

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

Sul mio sistema, in esecuzione che il codice genera output seguente:

Come si può vedere, alcune applicazioni forniscono più di un file desktop (smplayer.desktop e smplayer_enqueue.desktop). Questi duplicati funzionali potrebbero essere rimossi, ma non è banale.

Ma si ricorda che alcuni desktop ignorano del tutto XDG. Se vuoi davvero un modo cross-desktop, dovresti inserire i file mailcap da qualche parte nel mix. Sono fermamente convinto che GNOME in realtà lo ignori.

+0

Per 'application/json' ottengo solo' org.gnome.Builder.desktop', ma c'è anche Atom e Gedit, se si guarda allo screenshot qui sopra. –

+1

E riguardo 'text/javascript' e' text/plain'? Sembra che [il tipo JSON MIME non fosse standardizzato in passato] (http://stackoverflow.com/questions/477816/what-is-the-correct-json-content-type), quindi forse GNOME torna a diversi tipi per gestire questi file. Dovresti trovare i file .desktop di Atom e Gedit e vedere quali tipi MIME dichiarano di supportare. O, altrettanto probabilmente, la mia soluzione non è abbastanza buona dopotutto. –

0

Invece di scrivere il proprio script come suggerito da @ MirosławZalewski, è consigliabile utilizzare lo strumentoperl-file-mimeinfo (ArchWiki link).

perl-file-mimeinfo fornisce gli strumenti mimeopen e mimetype. Questi hanno un'interfaccia leggermente più bello di loro xdg-utils equivalenti:

# 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 

L'opzione -d, opzione lunga --ask-default, consente all'utente di scegliere un nuovo programma predefinito per i file dati.
L'opzione -n, opzione lunga --no-ask, non richiede all'utente quale programma utilizzare, sceglie il programma predefinito o il primo programma noto per gestire il tipo di file.

In Fedora, questo pacchetto si chiama perl-File-MimeInfo.
In Debian e Ubuntu, è chiamato libfile-mimeinfo-perl.