使用sudo apt-get remove ^k3b
代替。当您安装或删除软件包时,*
通常很危险,几乎不需要。如果你使用*
,你应该引用它,但是这并不能使其更安全,因为比你想要的方式的结果的倾向来选择更为封装apt
和apt-get
解析它并没有的效果路径扩展。
- 甚至安全使用
*
也常常是不必要的。
- 不安全的使用是残酷的。删除
k3b*
将删除名称中包含k3
任何位置的每个程序包(以及依赖于该程序包的每个程序包)。这不是一个错字k3
,即使没有,也包含在内就足够了b
,因为它b*
表示“零或多个b
s”。
当运行apt
或apt-get
与install
,remove
或purge
动作,每个后续参数是第一1解释为个别包的名称。如果存在具有该确切名称的软件包,则将对其执行操作。
如果不存在这样的包,apt
并且apt-get
将检查参数包含任何常见的正则表达式 元字符2 .
,?
,+
,*
,|
,\[
,^
,或$
。如果没有,那就完成了-没有找到软件包。
如果确实包含这些字符中的任何一个,则将其视为正则表达式并与任何程序包名称的任何部分进行匹配。它不必与全名匹配。正如其他人所说,*
正则表达式与*
glob 并不意味着同一件事。?
也没有。在正则表达式中:
*
允许前一项显示任意次数-包括一次或完全不显示-而不是一次。
?
将前一项设为可选 -也就是说,它允许它出现零次或一次。
apt-get(8)(man apt-get
)说:
如果没有包与给定的表达式匹配,并且该表达式包含“。”,“?”之一 或'*',则假定它是POSIX正则表达式,并将其应用于数据库中的所有包名称。然后将安装(或删除)所有匹配项。请注意,匹配是通过子字符串完成的,因此“ lo。*”匹配“ how-lo”和“最低”。如果不希望出现这种情况,请使用“ ^”或“ $”字符锚定正则表达式,或者创建更具体的正则表达式。
手册页只提到.
,?
和*
,但它是不完全的,如+
,|
,[
,^
,和$
也足以让apt-get
或apt
解释图案作为正则表达式。3
虽然可以匹配任何数量的任何字符.*
- 不只是*
-您只需要这个,如果它会出现在中间的正则表达式。由于该模式与程序包名称的任何子字符串匹配,因此在模式的结尾(或开头)毫无意义。
该联机帮助页中提到^
和$
。这些(尤其是^
)的关键是编写安全,高效的方式与使用install
,remove
或者purge
在行动apt
或apt-get
。
^
将正则表达式锚定到整个字符串的开头。^k3b
选择其名称的所有包开始使用k3b
。
$
将正则表达式锚定到整个字符串的末尾。k3b$
将选择其名称的所有包结尾带k3b
。
因此,您可以使用此命令安全地删除软件包:
sudo apt-get remove ^k3b
最后,在您提到的特定情况下,您最好自己传递两个名称:
sudo apt-get remove k3b k3b-data
这样您就可以避免所有这些复杂性!(虽然使用起来^
很简单,但是锚定很简单。)或者使用brace expand,它会将您的shell扩展为上述命令:
sudo apt-get remove k3b{,-data}
1 有两个例外:(a)中的一些选项(例如,-f
,--purge
)被识别,和 (b)中出现在某些标点字符结束,否则将被认为是包的名称以执行动作可以是一个参数的用于更改已完成的操作(例如,sudo apt install ubuntu-desktop^
安装任务而不是软件包,以及何时^
显示在末尾)。
2 存在其他正则表达式元字符。例如,\
正则表达式的所有方言都支持和常用。.
,?
,+
,*
,|
,[
,^
,并且$
恰好是元字符的APT开发商决定将触发解释为正则表达式(如命名一个确切的封装解决方案后已失败)。
3 验证这一点的最简单方法是,使用上述-s
选项模拟采用这种模式的安装或拆卸。例如,运行apt -s install ^virtualbox
显示可能sudo apt install ^virtualbox
会尝试安装软件包管理器知道其名称以开头的每个软件包virtualbox
。但是,也可以通过检查源代码来验证此行为。检查中的CacheSetHelper::PackageFromRegEx
功能cacheset.cc
。