获取类似于Ubuntu软件中心的(简短)安装应用程序列表的脚本?

我如何编写脚本来获取Ubuntu软件中心报告的已安装软件列表?

我可以找到的每个引用都提到dpkg -l或rpm -qa(或其中的一些变体),但这些通常包括每个最后一个包和库以及什么不是,并且最终得到1000个条目的列表。

然而,Ubuntu软件中心应用程序显示了一个简洁(和人性化)列表 – 目前我的Ubuntu盒子上有67个项目。 这是我感兴趣的那种列表。有人能指出我可以获得类似内容的脚本吗? 最好是可以在其他发行版上运行的东西,但我会采取我能得到的任何东西。

谢谢。

在Python中,您可以通过以下方式获取已安装软件包的列表:

import apt packages = apt.Cache() packages.open() installed_packages = [i.name for i in packages if i.is_installed] 

如果您想了解有关软件包的其他信息,则该过程会涉及更多内容。 有关可用的所有信息,请参阅Python的apt模块的文档。 此外,您可以查看软件中心的来源,了解他们的工作。

仅仅通过查看某个文件或运行简单命令,您将无法获得此信息。 你需要做一些脚本。

编辑:我相信软件中心从那些发布.desktop文件的软件包中获取要显示的软件包列表。 它可能比这更复杂,但您可以轻松地将列表过滤到已安装并具有.desktop文件的软件包。 此示例继续我之前的代码:

 import os desktop_files = ['.'.join(i.split('.')[:-1]) for i in os.listdir('/usr/share/applications')] installed_in_software_center = [i for i in installed_packages if i in desktop_files] 

可能仍然不是你想要的……

 dpkg --get-selections 

如果没有(我还不能发表评论),请运行以下内容并让我知道该号码(只计算行数)。

 dpkg --get-selections | wc -l 

您可以从/var/log/apt的日志中获取数据。 随着日志的旋转,大多数都被压缩。 首先,我们将当前日志与压缩日志结合起来,然后我们提取所有已安装的软件包,但不会自动提取。 这只是我的试验和错误,所以它可能会被清理一下。

 cd /var/log/apt sudo -s cat history.log > allhistory zcat history.log*gz >> allhistory.log cat allhistory.log | grep Install | sed s/Install://g | tr ')' '\n' | grep -v automatic | sed s/,//g | sed s/:.*$//g | sort -u | grep -v "^$" 

据我所知,软件中心根据软件包所在的部分进行过滤。虽然它与软件中心使用的filter不完全相同,但您可以通过过滤库软件包来执行类似操作:

 dpkg --get-selections|grep -i -v "deinstall"|grep -v "lib" 

grep用于过滤掉未安装或通常由软件中心隐藏的内容。 您可以根据需要添加更多内容以进行过滤 – “lib”字符串是一个很好的指示,它不是最终用户应用程序。

也许APTonCD会有所帮助?

它是一个扫描APT安装包并为您构建列表的工具。 然后,您可以手动选择/取消选择所需的列表,保存列表,甚至可以下载/使用缓存将选定的包保存在CD /文件夹中(用于离线自动安装当前安装的应用程序)

它还有一些filter,如include依赖项,包括旧版本等。

APTonCD默认在Mint 10中,但由于它们共享相同的Ubuntu存储库,您可以通过软件管理器安装它。

可能显示的软件中心(以及应用程序的含义)是.desktop文件。 基本上它们可以作为实际二进制文件的快捷方式(根据Windows快捷方式和.exe文件来考虑)。

通过软件管理器安装的大多数(但不是全部!)应用程序在/usr/share/applications都有一个快捷方式。 该文件的结构是这样的:

 [Desktop Entry] Name=My App Name Exec=/full/path/to/binary Comment=this app does something Icon=/full/path/to/icon.png 

Unity的应用程序范围解析这些文件文件以提取应用程序的描述和名称。 我们可以用这个命令做类似的事情:

  find /usr/share/applications/ -maxdepth 1 -type f -iname "*.desktop" | xargs awk -F '=' '/Desktop Entry/{seek=1}; {if(seek==1 && $0~/Name=/){$1="";print;seek=0;next}}' 

基本上我们生成所有那些.desktop文件的列表,解析它们以提取具有Name=的行,但仅显示=符号后的行的一部分。

正如我所提到的,一些应用程序没有.desktop文件或者可能存储在/opt文件夹中,因此您可能希望在/opt目录中执行相同的命令(删除-maxdepth 1 )。