如何使用 apt 选择不完整的软件包?

如何使用 apt 选择不完整的软件包?

是否有一种简单的方法来选择一系列软件包(特别是与内核相关的软件包)以使用 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-getstdin 文件描述符,因此 apt-get 可以正常接收输入(例如 debconf 问题的答案)。 xargs从标准输入获取自己的输入,因此不应该与交互式程序一起使用,即可能需要从标准输入输入的程序。

要使用apt-getwith 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

相关内容