Список установленных приложений, сгруппированных по типу

Мне нужен список приложений, установленных в моей системе, однако мне нужны только те, которые перечислены в меню «Пуск».

Меня не интересует список пакетов / зависимостей и т. Д., Поэтому следующее не очень полезно:

 dpkg --get-selections | grep -v deinstall

Этот немного ближе.

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

Однако имена не совпадают точно с тем, что есть в меню, и это не соответствует моему другому критерию их группировки.

например. Я хочу видеть

Graphics
     GIMP Image Editor

, а не

gimp

. Итак, подведем итог: я ищу способ сохранить в текстовом файле то, что отображает Алакарте.

3
задан 13 April 2017 в 15:23

3 ответа

Сценарий Python ниже читает (английский или международный*) имена интерфейса от всех файлов на рабочем столе в /usr/share/applications, а также их Categories - раздел. Это перечисляет все найденное применение, согласно их категориям. Так как много приложений действительно имеют несколько категорий, приложения могут появиться больше чем в одной категории.

Если приложение имеет нет Categories= упоминание, это упоминается в Uncategorized - разделите вниз в списке.

*Обратите внимание, что Некоторые приложения (как Thunderbird) имеют обширный список имен интерфейса для каждого языка. Этот сценарий, как это, читает первое имя интерфейса, которое является на международном уровне используемым. Сценарий может быть изменен, чтобы считать имя на определенном языке (если есть) или автоматически считать язык системы, но этому было бы нужно немного более обширное кодирование :)

Использовать его:

Скопируйте сценарий ниже, мимо него в пустой файл, сохраните его как applist.py. выполните его командой (в окне терминала):

python3 /path/to/script/applist.py

Сценарий:

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

Производить впечатление вывода:

Маленький раздел моего вывода:

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
ответ дан 13 April 2017 в 15:23

Следующий сценарий даст вывод, очень подобный тому, что Вы хотите.

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

даст вывод как

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

Объяснение

  • var: хранит список всех возможных категорий.
  • внутреннее для цикла находит список приложений, который содержит категорию в соответствии с внешним для цикла. Внутреннее для цикла также выводы все требуемое.

я также попробовал другой сценарий, который производит настоящее имя (Редактор изображений GIMP), а не имя пакета (канитель), но это дает странные результаты, потому что некоторые файлы на рабочем столе не содержат новые строки

3
ответ дан 13 April 2017 в 15:23

Если Вы выполняете это:

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

Тогда filesystem.manifest похож на это:

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

Это показывает все детали приложения.

apt-cache show zim
0
ответ дан 13 April 2017 в 15:23

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

Похожие вопросы: