如何列出特定类别(组件)的所有已安装的包

如何列出特定类别(组件)的所有已安装的包

是否可以使用 apt、apt-cache、aptitude 等实用程序列出特定官方存储库组件(主、受限、Universe 或 Multiverse)中所有已安装的软件包?

为此我写了一个简单的脚本:

dpkg -l | grep ^ii | cut -f3 -d ' ' | while read -r pkg;
do
 status=`apt-cache show $pkg | grep -m1 "Section: multiverse"`
 if [ ! -z "$status" ] 
 then
  echo $pkg
 fi
done;

它可以工作,但是速度很慢,因为它要逐个检查所有包。运行time此脚本的命令将产生:

real    1m16.797s
user    0m57.008s
sys     0m8.260s

我已经尝试过了能力搜索模式, 和dpkg-查询格式化,但似乎他们没有适当的列/模式来为此目的创建查询。

我也看了电压有效值脚本来了解它是如何工作的,因为它可以非常快地找到 contrib/non-free 包,似乎 vrms 脚本会扫描整个/var/lib/dpkg/status文件,寻找诸如“Section: (contrib | non-free | restricted | multiverse | partner )”之类的内容,所以它也没有帮助,因为不是所有的包都有这个部分。

答案1

好吧,我没有找到任何使用标准实用程序的解决方案,但是在查看了vrms我想出了一个更好的脚本来搜索从特定组件安装的包。

我问题中提到的另一个脚本确实很耗时。
不过,新脚本可在此处获取:pkgs-from.sh

用法是:

./pkgs-from.sh universe # or main, multiverse, backports

该命令的结果time如下:

real    0m4.367s
user    0m0.980s
sys     0m0.408s

这非常好。

怎么运行的?
该脚本将从目录中的相关文件中创建与请求的组件相关的所有包的列表/var/lib/apt/lists/,然后开始搜索它们,而不是使用apt-cache

答案2

为喜欢这种方法的人添加一个 Python 脚本:

import apt


cache = apt.Cache()
package_count = 0

for package in cache:
    if (
        cache[package.name].is_installed
        and package.candidate.origins[0].origin == "Ubuntu"
        and package.candidate.origins[0].component == "universe"
    ):
        package_origin = package.candidate.origins[0]
        print(
            package.name,
            # See https://apt-team.pages.debian.net/python-apt/library/apt.package.html#apt.package.Origin
            # for further details on the meanings of the below
            package_origin.origin,  # The Origin, as set in the Release file
            package_origin.archive,  # The archive (eg. Ubuntu release name)
            package_origin.component,  # The component (eg. main/universe)
            # package_origin.site,  # The hostname of the site.
            # package_origin.label,  # The Label, as set in the Release file
            # package_origin.trusted,  # Origin trusted (Release file signed by key in apt keyring)
        )
        package_count += 1

print(package_count, "packages from Ubuntu universe")

速度应该以秒为单位,而不是以分钟为单位传输已安装的软件包apt-cache policy列表

答案3

这里我的监控给定组件的已安装软件包的脚本

FILTER=non-free TMP_DIR=$(mktemp -d) && {
  dpkg -l | grep ^ii | cut -f 3 -d' ' | cut -f 1 -d : | sort | uniq > ${TMP_DIR}/pkg_installed.list
  cat /var/lib/apt/lists/*_${FILTER}_*Packages | grep "^Package:"  | sort | uniq | cut -d' ' -f2 > ${TMP_DIR}/pkg_filtered.list
  comm -12 ${TMP_DIR}/pkg_installed.list ${TMP_DIR}/pkg_filtered.list
}

相关内容