考虑只有一个文件.foo
的目录。然后rm -rf *
无法删除.foo
;只有rm -rf .*
会。为什么会这样? (我想这与默认的.
和..
有关,但设计原理是什么?当它们被删除时,我倾向于留下点文件。)
答案 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
,是一个隐藏文件。整个目录上的易失性操作最终可能会造成更多的破坏。