Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I use directory globbing in JDK7

I have been trying to use the new globbing feature in JDK7, starting from the documentation and examples

I can get globs such as "glob:*.dat" to work with the

Files.walkFileTree(startingDir, finder);

example but I have been unable to get the "**" syntax working. I would like to be able to create something like:

matcher = FileSystems.getDefault().getPathMatcher("glob:" + "foo/**/bar/*.dat");

and would be grateful for a simple example. I am using Windows 7.

UPDATE: @Oleg and @JBNizet make it clear that the "/" syntax is OS-independent. Note that the Javadocs suggest that OS-dependent syntax is also possible (?required)

STILL PROBLEMS: Have taken @Nizet and edited as follows:

@Test
public void testStackoverflowGlobber() throws IOException {
    final PathMatcher matcher =
 FileSystems.getDefault().getPathMatcher("glob:*.cml");
        Files.walkFileTree(Paths.get("d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources"), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println("try>> "+file);
                if (matcher.matches(file)) {
                    System.out.println("MATCHES>>"+file);
                }
                return FileVisitResult.CONTINUE;
            }
        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    });
}

and this gives output such as:

try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdx
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdxml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cdxml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cif\aa2004.cml

but no evidence of matching

like image 599
peter.murray.rust Avatar asked Feb 05 '12 10:02

peter.murray.rust


People also ask

What does glob command do?

In computer programming, glob (/ɡlɑːb/) patterns specify sets of filenames with wildcard characters. For example, the Unix Bash shell command mv *. txt textfiles/ moves ( mv ) all files with names ending in . txt from the current directory to the directory textfiles .

What method retrieves useful information about a file in Java?

You can retrieve a file system's PathMatcher by using the getPathMatcher(String) method in the FileSystem class.

What is a glob file?

A glob is a term used to define patterns for matching file and directory names based on wildcards. Globbing is the act of defining one or more glob patterns, and yielding files from either inclusive or exclusive matches.


2 Answers

Here's a working example which displays all the zip files in any descendant directory of d:/:

public static void main(String[] args) throws IOException {
    final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip");
    Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            if (matcher.matches(file)) {
                System.out.println(file);
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    });
}

As you see, using forward slashes works on Windows.

like image 76
JB Nizet Avatar answered Oct 13 '22 15:10

JB Nizet


You need to start your glob with **

matcher = FileSystems.getDefault().getPathMatcher("glob:**/foo/**/bar/*.dat");

Otherwise, calling

matcher.matches(file)

attempts to match the full path to the file against a regular expression that starts with the relative path (/foo/), rather than with the absolute path (d:/petermr-workspace/.../foo).

Prepending the ** to the glob just tells it to ignore the beginning of the absolute path.

like image 31
Cody A. Ray Avatar answered Oct 13 '22 13:10

Cody A. Ray