apt:从特定来源查询已安装的软件包

apt:从特定来源查询已安装的软件包

我正在尝试获取来自我公司的私人 apt 存储库的已安装软件包列表。

这有效:

#!/bin/bash
fqdn=$1

for pkg in $(dpkg-query --show | awk '{print $1;}'); do
  if apt-cache showpkg $pkg | grep -q $fqdn; then
    echo $pkg
  fi
done

但在安装了 ~3466 ( ) 软件包的系统上运行它dpkg -l | wc -l需要 1m45.812s。向我的用户显示“在本地扫描已安装的软件包”的时间太长了。

有一个更好的方法吗?


我尝试用 替换apt-cache showpkgapt show读取该APT-Sources:行。这会警告 apt 的 CLI 界面不稳定,并耗时 15 分 35.913 秒。

答案1

不要循环包:

dpkg -l | awk '/^ii/ { print $2 }' | xargs apt-cache showpkg |
awk "/^Package:/ { package = \$2 } /$1/ { print package }" | uniq

在我的系统上,这需要几秒钟的时间,安装了 6,000 多个软件包,并且不涉及/var/lib/apt直接使用。

有一些限制,特别是它不检查哪些版本当前已安装 v. 哪个可以从存储库中获得,而且 Debian 没有提供任何方法来确定软件包实际是从哪个存储库安装的。

答案2

这个只需要0m3.654s但使用/var/lib/apt

#!/bin/bash
fqdn=$1
for pkg in $(dpkg-query --show | awk -F "[ \t:]" '{print $1;}'); do
  if grep -q "Package: $pkg" /var/lib/apt/lists/${fqdn}_*_Packages; then
    echo $pkg
  fi
done

我知道这/var/lib/apt是内部的apt,因此apt可以选择更改实现并破坏脚本。这可能不太可能,但有可能发生。相反,通常最好使用apt工具来访问这些数据。

相关内容