'apt show' 的信息在哪里' 已存储?

'apt show' 的信息在哪里' 已存储?

我有以下问题:我写了一个脚本,用于提取有关我的系统(Ubuntu 16.04 LTS)已安装软件包的信息。我特别感兴趣的是来源包的数据。这意味着APT 来源对我来说apt show <packagename>至关重要。

到目前为止,我的脚本必须调用apt show每个已安装的包,这会产生几乎不可接受的工作量,与这个任务应该有多小相比 [CPU 负载几乎达到 100%]。

我希望系统上有某个文件,其中存储了所有输出信息apt show。读取和解析该文件应该比调用apt show数千次要快。有这样的文件吗?


请注意,我已经尝试使用dpkgapt-cache,但两者都不提供APT 来源信息。


编辑:也许一些详细说明可能会有用。我的 Python 脚本调用apt list --installed以获取已安装软件包的列表,并将此输出解析为列表,其中仅包含软件包名称作为字符串。

然后它调用apt show此列表中的每个元素。

我希望只有一个文件,读取一次,其中包含有关已安装软件包的信息。然后,我会让我的脚本解析此文件,将信息添加到列表元素中,并在一次迭代中完成。我希望,一次读取大文件并解析它比调用 CLI 命令数百次要快。

因此,我认为grep多次对多个文件进行操作并不会真正减少工作量。

答案1

这里:

ls /var/lib/apt/lists

依赖于存储库和部分,例如,要收集有关架构部分的数据,wgetmain可以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']

相关内容