是否有一种简单的方法来选择一系列软件包(特别是与内核相关的软件包)以使用 apt(或其他工具)进行安装或删除?
目前,我正在尝试删除一系列旧内核apt remove linux-\*-4.4.0-{40..80}-\*
。
这正确地选择了我想要删除的包,但是该过程立即被以下形式的错误中断E: Couldn't find any package by glob 'linux-*-4.4.0-65-*'
。
事实上,没有与此正则表达式对应的包,但令我感到非常惊讶的是,这会导致错误而不是警告。毕竟,删除一组空包是微不足道的!
答案1
这可以使用以下方法完成命令替换。例如:
apt-get remove $(dpkg -l 'linux-*' | awk '/-4.4.0-([4-7][0-9]|80)-/ { print $2}')
或者dlocate
如果您已安装它:
apt-get remove $(dlocate -k | grep -E -- '-4.4.0-([4-7][0-9]|80)-')
与任何涉及 的解决方案不同xargs
,命令替换不会更改 的apt-get
stdin 文件描述符,因此 apt-get 可以正常接收输入(例如 debconf 问题的答案)。 xargs
从标准输入获取自己的输入,因此不应该与交互式程序一起使用,即可能需要从标准输入输入的程序。
要使用apt-get
with xargs
,您首先必须确保它不会提出任何问题,例如:
export DEBIAN_FRONTEND=noninteractive
dlocate -k | grep -- -4.4.0- | xargs apt-get remove -y
注意dlocate
:该-k
选项列出了所有已安装的内核和 dkms 相关软件包,每行一个(并且-K
执行相同的操作,但采用详细dpkg -L
格式)。我添加了-k
选项来dlocate
启用这种用法,但直到现在我从来没有想到在 后面应该有一个可选的 regexp 参数-k
,尽管这是完全显而易见的 - 我总是只是将它与grep
.
的下一个版本dlocate
(即 >= 1.08)将支持,dlocate -k '-4.4.0-'
无需通过管道输出grep
。
答案2
我想类似的东西apt list linux-\*-4.4.0-{40..80}-\*|awk -F '/' '{print $1}' |xargs apt remove
应该有效。
答案3
获取已安装软件包的列表 ( linux-image
):
dpkg --list | grep linux-image | awk '{print $2}' > file
排序/编辑您的file
,仅保留linux-image
要删除的 ,然后运行:
file=$(cat file)
echo "$file"
apt remove $file