假设我想安装所有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 list
和egrep
(或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 界面。在脚本中请谨慎使用。