如何将已安装的软件包传送至 apt-cache?

如何将已安装的软件包传送至 apt-cache?

我正在尝试获取已安装软件包的软件包描述。

它看起来像这样:

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

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

答案1

您猜测的语法{} \;特定于该find命令,并且在此上下文中不起作用。您可以使用xargs例如

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

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

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

尽管在这种情况下它是多余的(对于您想要在命令末尾以外的位置替换管道值的情况它很有用)。


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

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

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}'

相关内容