为什么rm *(1)*删除目录中的所有文件?


47

我期望:

$ rm *(1)*

将删除(1)名称中包含的所有文件。我错了。它删除了目录中的所有文件。

为什么?


5
每当使用rm模式时,echo在发出实际命令之前,我总是先于模式。这个习惯为我节省了不止一次(从6岁左右开始,就混淆了DEL A: *.*和的区别DEL *.* A:)。
格里特2014年

Answers:


51

来自man bash

*(pattern-list)
                 Matches zero or more occurrences of the given patterns

您有一个glob表达式,该表达式匹配以零或多个1s 开头的文件-这是所有文件。

禁用这种通行行为的一种简单方法是\转义括号:

rm *\(1\)*

否则,您可以shopt -u extglob用来禁用该行为并shopt -s extglob重新启用它:

shopt -u extglob
rm *(1)*
shopt -s extglob

请注意,正如Stephane所说extglob通过bash-completion禁用它来启用它可能会导致完成功能无法正常工作。


7
请注意,extglob默认情况下未启用该功能,但如果已安装并启用该功能,则由bash_completion启用。bash没有像zsh这样的选项的本地范围。
斯特凡Chazelas

1
还要注意,bash-4.3其中的回归*(1)*也将扩展隐藏文件。
斯特凡Chazelas

@StephaneChazelas您是否提供与该回归相关的错误的链接?谢谢
2014年

2
@Basic,你去。Chet尚未回复。
斯特凡Chazelas

9

这可能与extglobshell选项有关。如果我将其关闭,该模式将产生一条错误消息:

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

另外,如果您不确定是否可以正常使用,请先使用echols测试模式:)


仅供参考:{是括号,(是括号(或圆括号)。
Mikel 2014年

嗯谢谢 我不是讲英语的母语人士,所以我倾向于将它们混淆:)
Martin von Wittich 2014年

6
英式:{=大括号,(=圆括号,[=方括号。在美国人中:{=大括号,(=括号,[=括号。有点混乱。如果您需要检查什么内容,那么术语表文件-ASCII会很有帮助。
Mikel 2014年

4
@Mikel谢谢,我也在这里检查过,所以现在我知道了花括号松鼠花括号

在印度英语中,{花括号,[方括号,(圆括号或更常见的是方括号。:-)
ShreevatsaR 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.