如何解决如何在 Java 中使用 glob 来匹配目录和子目录中的文件?
我有一种情况,我需要沿着特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有 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,但我也不确定如何构建该正则表达式。
解决方法
您的第一个 glob 与第二个文件不匹配,因为 **
和 /foo
之间没有 .java
可以匹配潜在的子目录。
您的第二个 glob 与第一个文件不匹配,因为 /foo
和 .java
之间有两个斜杠无法与 {{1} 根目录下的 .java
文件匹配}}
如果 /foo/
目录始终位于您要搜索的目录的根目录,我建议使用 /foo/**.java
,否则使用 foo
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。