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

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

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

 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 ответа

Решение

Сценарий 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

Следующий скрипт даст вывод, очень похожий на то, что вы хотите.

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: хранит список всех возможных категорий.
  • Внутренний цикл for находит список приложений, который содержит категорию, предоставленную внешним циклом for. Внутренний цикл for также выводит все необходимое.

Я также попробовал другой скрипт, который выводит реальное имя (GIMP Image Editor), а не имя пакета (gimp), но он дает странные результаты, потому что некоторые файлы рабочего стола не содержат перевода строки

Если вы запустите это:

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
Другие вопросы по тегам