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

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

假设我想安装所有ubuntu-wallpapers软件包,那么我会在终端输入以下内容:

sudo apt install ubuntu-wallpapers*

我正在尝试使用

dpkg --set-selections < ./pkgs.txt

问题是,这种方法不支持文件*中的通配符 pkgs.txt

我能够使用以下方法获取软件包的确切列表

apt-cache search ^ubuntu-wallpapers

但我也得到了描述。有没有办法只获取包名称,以便我可以将输出重定向到文件pkgs.txt

答案1

您可以使用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}'
    

答案2

替代使用apt listegrep(或ripgrep):

  • 搜索一组包:

    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 没有稳定的 CLI 界面。在脚本中请谨慎使用。

相关内容