按类型分组列出已安装的应用程序

按类型分组列出已安装的应用程序

我想要一个系统中安装的应用程序列表,但是,我只想要按照开始菜单列出的应用程序列表。

我对软件包/依赖项列表等不感兴趣,因此以下内容没有太大帮助:

 dpkg --get-selections | grep -v deinstall

更近一点。

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

但是,这些名称与菜单中的内容不完全匹配,并且不符合我对它们进行分组的其他标准。

例如我想看看

Graphics
     GIMP Image Editor

不是

gimp

总而言之,我正在寻找一种将 Alacarte 显示的内容保存到文本文件的方法。

答案1

下面的 Python 脚本从 中的所有桌面文件/usr/share/applications及其Categories-section 中读取(英语或国际*)界面名称。它根据类别列出所有找到的应用程序。由于许多应用程序确实有多个类别,因此应用程序可以出现在多个类别中。

如果应用程序没有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

答案2

以下脚本将提供与您想要的非常相似的输出。

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 图像编辑器)而不是包名称(gimp)的脚本,但它给出了奇怪的结果,因为一些桌面文件不包含换行符

答案3

如果你运行这个:

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

相关内容