【发布时间】:2021-05-28 00:21:52
【问题描述】:
我有一种情况,我需要沿特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有some/root/dir/foo/bar.java 和some/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 一开始就不起作用,所以我宁愿等待更有知识的人提出答案。很高兴我能帮上忙!