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