3

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

4

4 回答 4

13

根据 Rob Pike 的说法,名称以点开头的文件应该被“隐藏”的整个概念是软件错误的结果

特别是,他说:

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

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

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

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

于 2013-07-04T05:47:23.520 回答
3

这是因为前缀为 的文件.通常是隐藏的,并且不是正常通配扩展的一部分。这意味着您不会在包含控制文件或目录(例如 .svn)的目录中得到混乱的 glob。当您使用 时*,您通常打算将其扩展为普通文件。

于 2013-07-04T05:46:20.350 回答
1

来自Bash 手册

当模式用于文件名扩展时,字符 '.' 除非设置了 shell 选项,否则必须显式匹配文件名的开头或斜杠之后dotglob。匹配文件名时,斜杠字符必须始终显式匹配。在其他情况下,“。” 字符没有特殊处理。

至于原因,我只能猜测。我想这是为了让您不会意外操作您不知道存在的文件(请记住ls不显示.foo)。

于 2013-07-04T05:44:48.163 回答
1

这背后的设计原理是,例如.foo,是一个隐藏文件。对整个目录的不稳定操作最终可能会造成比预期更大的损害。

于 2013-07-04T05:47:05.453 回答