我正在尝试获取来自我公司的私人 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 showpkg
来apt 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
工具来访问这些数据。