如何使用 Java 中的 glob 来匹配目录和子目录中的文件?

How can I use a glob in Java to match files in directory and subdirectories?

我有一种情况,我需要沿着特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有 some/root/dir/foo/bar.javasome/root/dir/foo/baz/quux.java。如果我尝试 运行 以下代码,我得不到我想要的结果:

private static void findMe(String srcPath, String matcherPattern) throws IOException {
  final List<Path> filePaths = new ArrayList<>();
  final PathMatcher matcher = FileSystems.getDefault().getPathMatcher(matcherPattern);
  Files.walkFileTree(srcPath, new SimpleFileVisitor<>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
      if (matcher.matches(file)) {
        filePaths.add(file);
      }
      return FileVisitResult.CONTINUE;
    }
  });
  filePaths.forEach(filePath -> System.out.println(filePath.toString()));
}

根据我的要求,我必须使用 "some/root" 作为 srcPath 参数的值。但是,如果我使用 findMe("some/root", "glob:**/foo/*.java"),我只会得到我的第一个文件;如果我使用 findMe("some/root", "glob:**/foo/**/*.java"),我只会得到第二个文件。我想做的事情是不是不能用 glob 做?如果我能用正则表达式替换 glob,我会非常乐意,但我也不确定如何构造该正则表达式。

您的第一个 glob 与第二个文件不匹配,因为 /foo.java 之间没有 ** 来匹配潜在的子目录。

您的第二个 glob 与第一个文件不匹配,因为 /foo.java 之间有两个斜杠无法与 .java 根目录下的文件匹配=16=]

如果 foo 目录始终位于您要搜索的目录的根目录,我建议使用 /foo/**.java,否则 **/foo/**.java