列出以特定单词开头的所有包的名称。

说我想安装所有的ubuntu-wallpapers软件包,所以我会在终端输入以下内容:
sudo apt install ubuntu-wallpapers*

我正在尝试使用相同的效果。
dpkg --set-selections < ./pkgs.txt

问题是,这种方法不支持 * 通配符在 pkgs.txt 文件中。
我能够使用以下方法获取确切的软件包列表:
apt-cache search ^ubuntu-wallpapers

但是我也得到了描述。有没有办法只获取软件包的名称,这样我就可以将输出重定向到pkgs.txt文件中?

一般建议:在引用模式时,始终使用例如星号或其他特殊符号。在您的情况下,shell将尝试将ubuntu-wallpapers*解释为通配符,匹配当前目录中的文件。只有当当前位置没有匹配的文件时,它才能正常工作,因为此时通配符将被保留为字面值。安全使用的方法是sudo apt install 'ubuntu-wallpapers*' - Byte Commander
2个回答

你可以使用apt-cache pkgnames来列出以特定前缀开头的所有软件包的名称:
$ apt-cache pkgnames ubuntu-wallpaper
ubuntu-wallpapers-karmic
ubuntu-wallpapers-vivid
ubuntu-wallpapers-maverick
ubuntu-wallpapers-utopic
ubuntu-wallpapers-wily
ubuntu-wallpapers-quantal
ubuntu-wallpapers-raring
ubuntu-wallpapers-precise
ubuntu-wallpapers-lucid
ubuntu-wallpapers-natty
ubuntu-wallpapers
ubuntu-wallpapers-trusty
ubuntu-wallpapers-oneiric
ubuntu-wallpapers-saucy
ubuntu-wallpapers-xenial

请参阅 man apt-cache 以获取更多信息。
或者,您可以处理 apt-cache search 的输出,并通过下面其中一个命令或类似命令的管道显示仅第一列:
  • cut -d' ' -f1
    
  • grep -Eo '^\S+'
    
  • sed 's/\s.*//'
    
  • awk '{print $1}'
    

使用apt listegrep的替代方法:
搜索一组软件包 ``` apt list --installed | grep -o "^[^/]*" | egrep "^(gcc|make|git)$" ```
搜索以某个开头的一组软件包 ``` apt list --installed | grep -o "^[^/]*" | egrep "^(gc|mak)" ```
中间的命令是获取包名。也可以用 cut -f1 -d"/" 来实现。
如果给出一个你想知道哪些包尚未安装的包列表:
pkglist="libcurl4-openssl-dev libsdl2-dev libopenal-dev libvulkan-dev libgl1-mesa-dev clang gcc make git"

comm -13 <(apt list --installed | cut -f1 -d"/" | sort) <(echo $pkglist | tr " " "\n" | sort)

对于第一个参数,你可以用 apt-mark showmanual 替代,以便与手动安装的软件包进行比较。
注意:

警告:apt没有稳定的命令行界面。在脚本中使用时需谨慎。