我想要一个系统中安装的应用程序列表,但是,我只想要按照开始菜单列出的应用程序列表。
我对软件包/依赖项列表等不感兴趣,因此以下内容没有太大帮助:
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