我有以下问题:我写了一个脚本,用于提取有关我的系统(Ubuntu 16.04 LTS)已安装软件包的信息。我特别感兴趣的是来源包的数据。这意味着APT 来源对我来说apt show <packagename>
至关重要。
到目前为止,我的脚本必须调用apt show
每个已安装的包,这会产生几乎不可接受的工作量,与这个任务应该有多小相比 [CPU 负载几乎达到 100%]。
我希望系统上有某个文件,其中存储了所有输出信息apt show
。读取和解析该文件应该比调用apt show
数千次要快。有这样的文件吗?
请注意,我已经尝试使用dpkg
和apt-cache
,但两者都不提供APT 来源信息。
编辑:也许一些详细说明可能会有用。我的 Python 脚本调用apt list --installed
以获取已安装软件包的列表,并将此输出解析为列表,其中仅包含软件包名称作为字符串。
然后它调用apt show
此列表中的每个元素。
我希望只有一个文件,读取一次,其中包含有关已安装软件包的信息。然后,我会让我的脚本解析此文件,将信息添加到列表元素中,并在一次迭代中完成。我希望,一次读取大文件并解析它比调用 CLI 命令数百次要快。
因此,我认为grep
多次对多个文件进行操作并不会真正减少工作量。
答案1
这里:
ls /var/lib/apt/lists
依赖于存储库和部分,例如,要收集有关架构部分的数据,wget
您main
可以amd64
使用:
grep -A20 "Package: wget" /var/lib/apt/lists/*_ubuntu_dists_xenial-updates_main_binary-amd64_Packages
或者按照 Muru 建议的方法awk
来获得更灵活的结果:
awk -v RS='\n\n' -v pkg=wget '$2 == pkg' /var/lib/apt/lists/*_ubuntu_dists_xenial_main_binary-amd64*
- 使用
RS
(记录分隔符)我们可以轻松获取与我们的包裹相关的所有数据。
请注意,apt
还使用了一些由上述文件组成的二进制缓存来提高其查询速度,这些缓存位于此处:
ls /var/cache/apt/
答案2
我基本上实施了一个系统来监视我们环境中已安装的软件包,收集有关它们的信息并检查其中是否安装了错误的版本。由于其中一些软件包来自我们自己的实习存储库,因此有必要知道软件包来自哪里。
使用 Python APT API:
#! /usr/bin/python3
import apt
cache = apt.cache.Cache()
for pkg in cache:
if pkg.is_installed:
name = pkg.name
version = pkg.installed.version
origins = [o.site for o in pkg.installed.origins if o.site]
print(name, version, origins)
示例输出:
$ ./foo.py| head
a11y-profile-manager-indicator 0.1.10-0ubuntu3 ['jp.archive.ubuntu.com']
account-plugin-facebook 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
account-plugin-flickr 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
account-plugin-google 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
accountsservice 0.6.40-2ubuntu11.3 ['jp.archive.ubuntu.com']
acl 2.2.52-3 ['jp.archive.ubuntu.com']
acpi-support 0.142 ['jp.archive.ubuntu.com']
acpid 1:2.0.26-1ubuntu2 ['jp.archive.ubuntu.com']
activity-log-manager 0.9.7-0ubuntu23.16.04.1 ['jp.archive.ubuntu.com']
adduser 3.113+nmu3ubuntu4 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']