为什么* .abc不匹配名为.abc的文件?

时间:2012-07-24 17:20:06

标签: macos git wildcard

我以为我理解了通配符,直到发生在我身上。基本上,我正在寻找一个外卡模式,它将返回所有未命名为.gitignore的文件。我想出了这个,这似乎适用于我能想到的所有情况:

ls *[!{gitignore}]

要真正验证这是否有效,我想我会否定表达式,看看它是否返回名为.gitignore的文件(实际上是以gitignore结尾的任何文件;所以1.gitignore也应该退回)。为此,我认为否定的表达是:

ls *[{gitignore}]    

但是,此表达式不会返回名为.gitignore的文件(尽管它返回名为1.gitignore的文件)。

基本上,我的问题,在简化之后,归结为:

  

为什么* .abc不匹配名为.abc

的文件

我想我可以从那里接受它。

PS:

  1. 我正在使用Mac OSX Lion(10.7.4)
  2. 我想向.gitignore添加一个子句,以便忽略给定文件夹中除.gitignore之外的所有文件。所以我最终在*文件中添加了.gitignore。结果是,git最终忽略了.gitignore:)
  3. 我在google上进行的大量搜索 - Use the asterisk character (*) to represent zero or more characters.

2 个答案:

答案 0 :(得分:3)

我假设您正在使用Bash。来自Bash manual

  

当模式用于文件名扩展时,除非设置了shell选项dotglob,否则必须明确匹配文件名开头或紧跟斜杠后面的字符“。”。

然而,

.gitignore模式的处理方式不同:

  

否则,git将模式视为适合fnmatch(3)使用FNM_PATHNAME标志的shell glob:模式中的通配符与路径名中的/不匹配。

根据fnmatch(3) docs,只有在FNM_PERIOD标志设置的情况下才必须明确匹配前导点,因此作为gitignore模式的*gitignore将匹配.gitignore

但是,有一种更简单的方法可以实现这一目标。让.gitignore忽略除.gitignore以外的所有内容:

*
!.gitignore

答案 1 :(得分:2)

如果您想忽略 gitignore文件之外的所有内容,请将其用作文件:

*
!.gitignore

以感叹号开头的行被解释为例外。