我正在尝试获取已安装软件包的软件包描述。
它看起来像这样:
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}'