Unix wildcard selectors? (Asterisks)

后端 未结 3 1044
清歌不尽
清歌不尽 2020-12-30 00:46

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

tmp/**/*

What is the purpose of using the double

相关标签:
3条回答
  • 2020-12-30 00:55

    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 讨论(0)
  • 2020-12-30 01:04

    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."
    
    0 讨论(0)
  • 2020-12-30 01:15

    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
    
    0 讨论(0)
提交回复
热议问题