Listar aplicativos instalados agrupados por tipo

3

Eu quero uma lista dos aplicativos instalados no meu sistema, no entanto, eu só quero os listados conforme o menu Iniciar.

Eu não estou interessado em uma lista de pacotes / dependências, etc, então o seguinte não é útil:

 dpkg --get-selections | grep -v deinstall

Este está um pouco mais perto .

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

No entanto, os nomes não correspondem exatamente ao que está no menu e não atendem ao meu outro critério de agrupá-los.

por exemplo. Eu quero ver

Graphics
     GIMP Image Editor

não

gimp

Para resumir, o que estou procurando é uma maneira de salvar em um arquivo de texto o que a Alacarte exibe.

    
por opticyclic 30.06.2014 / 23:45

3 respostas

3

O script python abaixo lê os nomes das interfaces (inglês ou internacional *) de todos os arquivos da área de trabalho em /usr/share/applications , bem como seus Categories -section. Ele lista todos os aplicativos encontrados, de acordo com suas categorias. Como muitos aplicativos têm várias categorias, os aplicativos podem aparecer em mais de uma categoria.

Se o aplicativo não tiver Categories= mention, ele será mencionado na seção Uncategorized abaixo na lista.

* Nota Algumas aplicações (como o Thunderbird) têm uma extensa lista de nomes de interface, para cada idioma. Este script, como é, lê o primeiro nome da interface, que é o internacionalmente usado. O script pode ser alterado para ler o nome em um idioma específico (se presente) ou ler automaticamente o idioma do sistema, mas isso precisaria de uma codificação um pouco mais extensa:)

Para usá-lo:

Copie o script abaixo, cole-o em um arquivo vazio e salve-o como applist.py . execute-o pelo comando (em uma janela de terminal):

python3 /path/to/script/applist.py

O 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)

Para dar uma impressão da saída:

Uma pequena seção da minha saída:

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
    
por Jacob Vlijm 01.07.2014 / 16:25
3

O script a seguir fornecerá a saída muito semelhante ao que você deseja.

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

fornecerá a saída como

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

Explicação

  • var : armazena a lista de todas as categorias possíveis.
  • O loop for interno localiza a lista de aplicativos que contém a categoria fornecida pelo loop externo. O loop for interno também exibe tudo o que é necessário.

Eu também tentei outro script que gera o nome real (GIMP Image Editor) ao invés do nome do pacote (gimp), mas dá resultados estranhos, porque alguns arquivos da área de trabalho não contêm novas linhas

    
por Registered User 01.07.2014 / 07:20
0

Se você executar isto:

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

Em seguida, o filesystem.manifest é assim:

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

Isso mostra todos os detalhes de um aplicativo.

apt-cache show zim
    
por oldfred 01.07.2014 / 01:00