如何将已安装的软件包传递给apt-cache?

我正在尝试获取已安装软件包的软件包说明。

它看起来像这样:

sudo apt list --installed | sed 's/\/.*//' | apt-cache search {} \; 

问题是将每行从sed发送到apt-cache。 有什么建议吗?

{} \; 您猜到的语法特定于find命令,在此上下文中不起作用。 你可以使用xargs ex。

 apt list --installed | sed 's/\/.*//' | xargs -n1 apt-cache search 

实际上xargs有自己xargs {}的语法,你可以在这里使用,即

 . . . | xargs -n1 -I{} apt-cache search {} 

虽然在这种情况下它是多余的(对于你想要在命令结尾以外的点替换管道值的情况下它很有用)。


然而, apt-cache search命令几乎肯定不是你想要的 – 它将在整个(在线)目录中搜索与apt list --installed每个结果相匹配的包。 即使您使用--names-only限制搜索范围,您仍会得到许多误报(即,安装的软件包和不是的软件包之间的子字符串匹配)。 它也会非常低效。

对于这个特殊的任务,我会完全跳过apt并使用较低级别的dpkg-query命令ex。

 dpkg-query -W -f='${binary:Package}: ${binary:Summary}\n' 

这将更有效(仅遍历包列表一次),并将严格限制在本地包目录中。

如果要将输出限制为当前安装的软件包,请添加db:Status-Abbrev字段并对其进行过滤,例如

 dpkg-query -W -f='${db:Status-Abbrev}\t${binary:Package} - ${binary:Summary}\n' | awk '/^ii/' 

要么

 dpkg-query -W -f='${db:Status-Abbrev}\t${binary:Package} - ${binary:Summary}\n' | awk -F'\t' '/^ii/ {print $2}'