Answers:
来自man bash
:
*(pattern-list)
Matches zero or more occurrences of the given patterns
您有一个glob表达式,该表达式匹配以零或多个1
s 开头的文件-这是所有文件。
禁用这种通行行为的一种简单方法是\
转义括号:
rm *\(1\)*
否则,您可以shopt -u extglob
用来禁用该行为并shopt -s extglob
重新启用它:
shopt -u extglob
rm *(1)*
shopt -s extglob
请注意,正如Stephane所说,extglob
通过bash-completion
禁用它来启用它可能会导致完成功能无法正常工作。
extglob
默认情况下未启用该功能,但如果已安装并启用该功能,则由bash_completion启用。bash
没有像zsh
这样的选项的本地范围。
bash-4.3
其中的回归*(1)*
也将扩展隐藏文件。
这可能与extglob
shell选项有关。如果我将其关闭,该模式将产生一条错误消息:
martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('
如果我打开它,它似乎确实可以匹配所有内容。手册中记录了这些模式,我认为它们是相关的:
If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following
description, a pattern-list is a list of one or more patterns separated
by a |. Composite patterns may be formed using one or more of the fol‐
lowing sub-patterns:
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
我没有看到任何文档指定没有前导字符的括号。无论如何,您可以通过引用括号来解决此问题:
martin@dogmeat ~ % echo *\(1\)*
A(1)b
另外,如果您不确定是否可以正常使用,请先使用echo
或ls
测试模式:)
{
是括号,(
是括号(或圆括号)。
{
花括号,[
方括号,(
圆括号或更常见的是方括号。:-)
rm
模式时,echo
在发出实际命令之前,我总是先于模式。这个习惯为我节省了不止一次(从6岁左右开始,就混淆了DEL A: *.*
和的区别DEL *.* A:
)。