【问题标题】:Why Unix wildcard "*" does not include ".*"?为什么 Unix 通配符“*”不包括“.*”?
【发布时间】:2013-07-04 05:42:00
【问题描述】:

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

【问题讨论】:

  • 这是一个古老的约定:以点开头的文件名对 shell “隐藏”。

标签: linux shell unix wildcard


【解决方案1】:

根据 Rob Pike 的说法,名称以点开头的文件应该是“隐藏的”was the result of a software bug

他特别说:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      来自Bash manual

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2010-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-14
          • 2019-08-12
          • 1970-01-01
          • 2020-05-18
          • 1970-01-01
          相关资源
          最近更新 更多