0

我以为我理解通配符,直到这发生在我身上。本质上,我正在寻找一种通配符模式,它将返回所有未命名的文件.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. 从我在谷歌上进行的众多搜索中 -Use the asterisk character (*) to represent zero or more characters.
4

2 回答 2

3

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

当模式用于文件名扩展时,字符 '.' 除非设置了 shell 选项 dotglob,否则必须显式匹配文件名的开头或斜杠之后。

但是,.gitignore模式的处理方式不同:

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

根据fnmatch(3) 文档FNM_PERIOD,只有在设置了标志时才必须显式匹配前导点,以便*gitignoregitignore 模式匹配.gitignore

不过,有一种更简单的方法可以做到这一点。.gitignore忽略一切,除了.gitignore

*
!.gitignore
于 2012-07-24T17:29:06.463 回答
2

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

*
!.gitignore

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

于 2012-07-24T17:31:06.707 回答