如何通过命令行获取存储库部分中所有软件包的列表?

在Synaptic中,可以按部分列出软件包。例如,在下面的图像中,列出了“Amateur Radio(universe)”部分的所有软件包。
如何在命令行中获取这样的列表(编辑:带有软件包描述)?
我需要一个原始列表;类似于aptitude的终端应用程序不适用。

synaptic


@bodhi.zazen 这是一个好建议,但它不能仅搜索该部分。 - Zombo
4个回答

确保已安装dctrl-toolsInstall dctrl-tools软件包。它提供了用于搜索apt和dpkg软件包列表的有用命令。要获取特定部分中所有可通过apt安装的软件包的完整描述,请运行以下命令:
grep-aptavail -F Section hamradio

这将显示hamradio部分中每个软件包的完整包元数据。如果您只想看到软件包名称,请运行。
grep-aptavail -n -F Section -s Package hamradio

如果您的系统设置为多架构,如果一个软件包适用于多个架构,它可能会在此列表中出现多次。因此,要进一步细化,请使用以下任一方式:
grep-aptavail -n -F Section -s Package hamradio | sort | uniq

或者

grep-aptavail -n -F Section -s Package hamradio | sort -u

对软件包列表进行排序,并删除具有相同名称的重复软件包。

请注意,您必须使用实际的部分名称,而不是 Synaptic 在其图形界面中显示的“可读性强”的名称。例如,上述搜索使用部分名称 hamradio,而不是 Synaptic 中显示的字符串“Amateur Radio”。

有关所有选项的完整描述和一些示例,请参阅 grep-aptavail 的 man 手册。


虽然你说你不想使用能力倾向因为输出的原因,但你需要知道你可以修改它来得到你喜欢的结果。
aptitude -F'|%p|%d|' search '?section(hamradio)'

关键是在修改输出格式的-F开关中。 %p表示软件包。当软件包具有不同的架构(如amd64 vs i386)时,也会输出此信息,%d则输出描述。您甚至可以更加个性化地调整搜索模式,例如排除已安装的软件包:

aptitude -F'|%p|%d|' search '?section(hamradio) !~i'

在这里,~i 表示已安装,而 ! 是一个否定,所以它的意思是 "未安装(!)" 或者如果你只想要适用于你的架构的那些可用的软件。
aptitude -F'|%p|%d|' search '?section(hamradio) ~r native'

~r 表示与软件包的架构匹配的 ?architecture(),而 native 则仅列出与系统相同架构的软件包,相当于 dpkg --print-architecture

因此,前一行可以更加简洁地写为:

aptitude -F'|%p|%d|' search '~s hamradio ~r native'

非常优雅,尤其是使用-F'|%p|%d|'。不过,是否有可能通过在search字符串中添加一个!表达式来避免列出:i386软件包? - Serge Stroobandt
1@GinGordon 是的,只需将 ~r native 添加到搜索条件中。~r 表示 ?architecture,用于匹配软件包的架构;native 表示仅列出与系统相同架构的软件包,相当于 dpkg --print-architecture 命令。顺便问一下,您需要包含软件包描述的列表吗? - Braiam
太好了!是的,我已经编辑了问题,包括了软件包的描述。请相应地修改你的回答,如果你能最简洁地回答,你将得到我最佳答案的投票。 - Serge Stroobandt
@GinGordon 你看一下。 - Braiam
...发现了一个名为morsei386软件包,尚未移植到amd64平台。因此,我的解决方案有74行,而你的只有73行! - Serge Stroobandt
@GinGordon 真奇怪...Debian有i386和amd64两种软件包。http://paste.ubuntu.com/7538389/.也许给维护者写封愤怒的邮件能解决问题。 - Braiam
aptitude -F'|%p|%d|' search '~s hamradio ~r native'更加酷炫简洁。感谢您的投票评论。 - Serge Stroobandt
1@GinGordon 如果你安装了 aptitude-doc 包,并且使用浏览器导航到 /usr/share/doc/aptitude/html/en/index.html,你将在 file:///usr/share/doc/aptitude/html/en/ch02s04s05.html 找到所有不好的附带条件。 - Braiam
请查看这个链接 - Serge Stroobandt

在一行上显示更多字段,使用任意分隔符

下面的一行代码将打印出存储库部分的所有唯一包名称,每个包名称都与其描述一起显示在单独的一行上。 所有字段都由竖线字符分隔,即可转换为Markdown竖线表格生成的表格可以在我的网站上找到。

grep-aptavail -n -s Package,Description -F Section hamradio |paste -sd '||\n' |sed 's:^:|:' |sort -u

您可以使用以下命令获取属于特定部分的软件包列表:
$ dpkg-query -W -f='${binary:Package} ${Section}\n' | awk '{if ($2 == "shells") {print $1}}'
bash
bash-completion
busybox-initramfs
busybox-static
dash
zsh
zsh-common