Unix通配符选择器? (星号)

时间:2010-08-20 10:26:00

标签: unix

在Ryan Bates'Railscast about git中,他的 .gitignore 文件包含以下行:

tmp/**/*

使用双星号后跟星号的目的是什么:**/*? 简单地使用tmp/*代替tmp/**/*会不会达到完全相同的结果吗?

谷歌搜索这个问题,我发现了一篇关于它的不太明确的IBM文章,我想知道是否有人可以澄清这个问题。

3 个答案:

答案 0 :(得分:25)

它表示要进入tmp以下的所有子目录,以及tmp的内容。

e.g。我有以下内容:

$ find tmp
tmp
tmp/a
tmp/a/b
tmp/a/b/file1
tmp/b
tmp/b/c
tmp/b/c/file2

匹配输出:

$ echo tmp/*
tmp/a tmp/b

匹配输出:

$ echo tmp/**/*
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2

这是zsh的默认功能,为了让它在bash 4中运行,你执行:

shopt -s globstar

答案 1 :(得分:5)

来自http://blog.privateergroup.com/2010/03/gitignore-file-for-android-development/

(kwoods)

"The double asterisk (**) is not a git thing per say, it’s really a linux / Mac shell thing.

It would match on everything including any sub folders that had been created.

You can see the effect in the shell like so:

# ls ./tmp/* = should show you the contents of ./tmp (files and folders)
# ls ./tmp/** = same as above, but it would also go into each sub-folder and show the contents there as well."

答案 2 :(得分:1)

根据the documentation of gitignore,自git版本1.8.2起支持此语法。

以下是相关部分:

  

与完整路径名匹配的模式中的两个连续星号(**)可能具有特殊含义:

     
      
  • 前导**后跟斜杠表示所有目录都匹配。例如,**/foo在任何地方匹配文件或目录foo   与模式foo相同。 **/foo/bar匹配文件或目录bar   直接位于目录foo下的任何地方。

  •   
  • 尾随/**匹配内部的所有内容。例如,abc/**匹配目录abc内的所有文件,相对于其位置   .gitignore文件,无限深度。

  •   
  • 斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,a/**/b匹配a/b,   a/x/ba/x/y/b等等。

  •   
  • 其他连续的星号被视为无效。

  •