开发者

Unix wildcard selectors? (Asterisks)

开发者 https://www.devze.com 2023-01-12 04:28 出处:网络
In Ryan Bates\' Railscast about git, his .gitignore file contains the following line: tmp/**/* What is the purpose of using the double asterisks followed by an asterisk as such: **/*?

In Ryan Bates' Railscast about git, his .gitignore file contains the following line:

tmp/**/*

What is the purpose of using the double asterisks followed by an asterisk as such: **/*? Would using simply tmp/* instead of tmp/**/* not achieve the exact same result开发者_StackOverflow?

Googling the issue, I found an unclear IBM article about it, and I was wondering if someone could clarify the issue.


It says to go into all the subdirectories below tmp, as well as just the content of tmp.

e.g. I have the following:

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

matched output:

$ echo tmp/*
tmp/a tmp/b

matched output:

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

It is a default feature of zsh, to get it to work in bash 4, you perform:

shopt -s globstar


From 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."


According to the documentation of gitignore, this syntax is supported since git version 1.8.2.

Here is the relevant section:

Two consecutive asterisks (**) in patterns matched against full pathname may have special meaning:

  • A leading ** followed by a slash means match in all directories. For example, **/foo matches file or directory foo anywhere, the same as pattern foo. **/foo/bar matches file or directory bar anywhere that is directly under directory foo.

  • A trailing /** matches everything inside. For example, abc/** matches all files inside directory abc, relative to the location of the .gitignore file, with infinite depth.

  • A slash followed by two consecutive asterisks then a slash matches zero or more directories. For example, a/**/b matches a/b, a/x/b, a/x/y/b and so on.

  • Other consecutive asterisks are considered invalid.

0

精彩评论

暂无评论...
验证码 换一张
取 消