web-dev-qa-db-fra.com

Liste des applications installées regroupées par type

Je veux une liste des applications installées dans mon système, cependant, je veux seulement celles listées selon le menu de démarrage.

Je ne suis pas intéressé par une liste de packages/dépendances, etc. donc ce qui suit n'est pas très utile:

 dpkg --get-selections | grep -v deinstall

This est un peu plus proche.

for app in /usr/share/applications/*.desktop; do echo "${app:24:-8}"; done

Cependant, les noms ne correspondent pas exactement à ce qui est dans le menu et il ne répond pas à mon autre critère de regroupement.

par exemple. Je veux voir

Graphics
     GIMP Image Editor

ne pas

gimp

Donc, pour résumer, ce que je recherche, c'est un moyen de sauvegarder dans un fichier texte ce qu'Alacarte affiche.

3
opticyclic

Le script python ci-dessous lit les noms d'interface (anglais ou international *) de tous les fichiers de bureau dans /usr/share/applications, ainsi que leur section Categories. Il répertorie toutes les applications trouvées, selon leurs catégories. Étant donné que de nombreuses applications ont plusieurs catégories, les applications peuvent apparaître dans plusieurs catégories.

Si l'application n'a pas de Categories= mention, il est mentionné dans la section Uncategorized dans la liste.

* Note Certaines applications (comme Thunderbird) ont une longue liste de noms d'interface, pour chaque langue. Ce script, tel qu'il est, lit le premier nom d'interface, qui est celui utilisé à l'échelle internationale. Le script peut être modifié pour lire le nom dans une langue spécifique (si présente), ou lire automatiquement la langue du système, mais cela nécessiterait un codage un peu plus étendu:)

Pour l'utiliser:

Copiez le script ci-dessous, collez-le dans un fichier vide, enregistrez-le sous applist.py. exécutez-le par la commande (dans une fenêtre de terminal):

python3 /path/to/script/applist.py

Le script:

#!/usr/bin/env python3
import os

uncategorized = []
categories = []
data = []
for item in os.listdir("/usr/share/applications"):
    if item.endswith(".desktop"):
        with open("/usr/share/applications/"+item) as data_source:
            lines = data_source.readlines()
        interface_name = [l.replace("\n", "").replace("Name=", "") \
                          for l in lines if l.startswith("Name=")][0]
        if len([l for l in lines if l.startswith("Categories")]) == 0:
            uncategorized.append(interface_name)
        else:
            subcats = [item for item in [l.replace("\n", "").replace(
                "Categories=", "") for l in lines if l.startswith(
                    "Categories=")][0].split(";") if item != ""]
            data.append([interface_name, subcats])
            categories = categories + subcats
categories = sorted([item for item in set(categories)])
for item in categories:
    applications = [subdata[0] for subdata in data if item in subdata[1]]
    print(item)
    for app in applications:
        print("   "+app)
print("Uncategorized")
for item in uncategorized:
    print("    "+item)

Pour donner une impression de la sortie:

Une petite section de ma sortie:

Audio
   Audacity
   MuseScore
   PulseAudio Volume Control
   Rhythmbox
AudioVideo
   Cheese
   VLC media player
   Audacity
   Rhythmbox
   MuseScore
   Videos
   OpenShot Video Editor
   Brasero
   PulseAudio Volume Control
   Rhythmbox
AudioVideoEditing
   Audacity
   MuseScore
   OpenShot Video Editor
BoardGame
   Mahjongg
Calculator
   Calculator
3
Jacob Vlijm

Le script suivant donnera une sortie très similaire à ce que vous voulez.

var=$(echo $(for f in /usr/share/applications/*.desktop;do cat $f|grep -i categories|sed -e 's/Categories=//g;s/\;/\n/g';done|sort|uniq))
for n in $var
do
  echo $n
  for f in /usr/share/applications/*.desktop
  do
    echo -e -n "\t" $f|sed -e 's!/usr/share/applications/!!g;s/.desktop/::/g'
    echo $(cat $f |grep -i categories|sed -e 's/Categories=//g;s/\;/:/g')
  done |grep -i :$n: |sed s/'::.*'//
done

Donnera la sortie comme

...
Development
     bluefish
     boa-constructor
     Eclipse
     gambas3
     GNUSim8085
     python2.7
     python3.2
     qtcreator
     ubuntusdk
DiscBurning
     brasero
     furiusisomount
Documentation
     Yelp
...

Explication

  • var: stocke la liste de toutes les catégories possibles.
  • La boucle for interne trouve la liste des applications qui contiennent la catégorie telle que fournie par la boucle for externe. La boucle for interne génère également tout ce qui est requis.

J'ai également essayé un autre script qui génère le vrai nom (GIMP Image Editor) plutôt que le nom du package (gimp) mais il donne des résultats étranges car certains fichiers de bureau ne contiennent pas de nouvelles lignes

3
Registered User

Si vous exécutez ceci:

dpkg-query -W --showformat='${Package} ${Version} ${Section}\n' > filesystem.manifest

Ensuite, filesystem.manifest ressemble à ceci:

abiword-common 2.9.2+svn20120213-1 editors
accountsservice 0.6.15-2ubuntu9.7 admin
acl 2.2.51-5ubuntu1 utils
acpi-support 0.140.1 admin
acpid 1:2.0.10-1ubuntu3 admin
activity-log-manager-common 0.9.4-0ubuntu3.2 utils
activity-log-manager-control-center 0.9.4-0ubuntu3.2 utils
adduser 3.113ubuntu2 admin
adium-theme-ubuntu 0.3.2-0ubuntu1 gnome

Cela montre tous les détails d'une application.

apt-cache show zim
0
oldfred