为什么Unix通配符“*”不包含“。*”?

时间:2013-07-04 05:42:01

标签: linux shell unix wildcard

考虑只有一个文件.foo的目录。然后rm -rf *无法删除.foo;只有rm -rf .*会。为什么会这样? (我想这与默认的...有关,但设计原理是什么?当它们被删除时,我倾向于留下点文件。)

4 个答案:

答案 0 :(得分:12)

Rob Pike认为,名称以点开头的文件应该被“隐藏”was the result of a software bug

他特别说:

  

首先,设定了一个不好的先例。许多其他懒惰程序员通过进行相同的简化来引入错误。以句点开头的实际文件在计算时通常会被跳过。

     

其次,更糟糕的是,创建了“隐藏”或“点”文件的想法。 [...]

     

我很确定隐藏文件的概念是一个意想不到的后果。这肯定是个错误。

除了历史事故之外,从通配符扩展中排除隐藏文件是一个很好的保守设计决策。否则rm *之类的命令可能会造成比用户预期更多的伤害。

答案 1 :(得分:2)

这是因为前缀为.的文件通常是隐藏的,并且不属于正常的globbing扩展。这意味着您不会在包含控制文件或目录(例如 .svn)的目录中获得混乱的全局。当您使用*时,通常会将其扩展为普通文件。

答案 2 :(得分:1)

来自Bash manual

  

当模式用于文件名扩展时,除非设置了shell选项dotglob,否则必须明确匹配文件名开头或紧跟斜杠后面的字符“。”。匹配文件名时,必须始终明确匹配斜杠字符。在其他情况下,'。'字符不会被特别处理。

至于理由,我只能猜测。我想这是因为你不会意外地操纵你不知道存在的文件(请记住ls不显示.foo)。

答案 3 :(得分:1)

这背后的设计理由是,例如.foo,是一个隐藏文件。整个目录上的易失性操作最终可能会造成更多的破坏。