【问题标题】:How can I use a glob in Java to match files in directory and subdirectories?如何在 Java 中使用 glob 来匹配目录和子目录中的文件?
【发布时间】:2021-05-28 00:21:52
【问题描述】:

我有一种情况,我需要沿特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有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,但我也不确定如何构建该正则表达式。

【问题讨论】:

  • 如果你想匹配 'some/root/foo' 及其子目录中的任何 .java 文件,请使用 findMe("some/root/foo", "**.java")
  • @Aaron 是的,如果我能够做到这一点,我可以这样限制起始位置,但我的要求不是这样。为了这个问题,假设源位置必须"some/root"。我将编辑问题以反映此要求。
  • **/foo/**.java 然后呢?没有前导 ** 如果 foo 将始终直接位于根目录内
  • @Aaron 就是这样。那应该可以完成工作。我没有考虑使用** 作为匹配器文件名段的一部分。如果您想将其添加为答案,我很乐意接受并投票。
  • 我不确定为什么你的第二个 glob 一开始就不起作用,所以我宁愿等待更有知识的人提出答案。很高兴我能帮上忙!

标签: java glob


【解决方案1】:

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

您的第二个 glob 与第一个文件不匹配,因为在 /foo.java 之间有两个斜杠无法匹配到位于 /foo/ 根目录的 .java 文件

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

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2019-12-13
    • 2010-11-08
    相关资源
    最近更新 更多