Когда использовать ** (двойную звезду) в синтаксисе glob в JAVA

Непосредственно из this Учебник Java Oracle:

Две звездочки, **, работают как *, но пересекают границы каталога. Эта синтаксис обычно используется для соответствия полных путей.

Может ли кто-нибудь сделать из этого реальный пример? Что они означают с "границей границ кросс"? Пересекая границу каталога, я представляю себе что-то вроде проверки файла от root до getNameCount()-1. И снова реальный пример, объясняющий разницу между * и ** на практике, будет большим.

Ответ 1

В javadoc для FileSystem#getPathMatcher() есть несколько хороших примеров и объяснений

*.java Matches a path that represents a file name ending in .java 
*.*    Matches file names containing a dot 

*.{java,class}  Matches file names ending with .java or .class 
foo.?           Matches file names starting with foo. and a single character extension 
/home/*/*       Matches /home/gus/data on UNIX platforms 
/home/**        Matches /home/gus and /home/gus/data on UNIX platforms 
C:\\*           Matches C:\foo and C:\bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:\\\\*")  

Итак /home/** будет соответствовать /home/gus/data, но /home/* не будет.

/home/* говорит каждый файл непосредственно в каталоге /home.

/home/** говорит каждый файл в любом каталоге внутри /home.


Пример * vs **. Предполагая, что ваш текущий рабочий каталог /Users/username/workspace/myproject, то следующее будет соответствовать только файлу ./myproject (каталог).

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*");
Files.walk(Paths.get(".")).forEach((path) -> {
    path = path.toAbsolutePath().normalize();
    System.out.print("Path: " + path + " ");
    if (pathMatcher.matches(path)) {
        System.out.print("matched");
    }
    System.out.println();
});

Если вы используете **, он будет соответствовать всем папкам и файлам в этом каталоге.