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

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

我对包/依赖项等列表不感兴趣,所以以下内容没有用处:

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显示的文本文件保存的方法。

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

如果应用程序没有Categories=提及,则会在列表中的Uncategorized -section中提及它。

*注意 某些应用程序(如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图像编辑器)而不是包名称(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