如何使用 Java 中的 glob 来匹配目录和子目录中的文件?
How can I use a glob in Java to match files in directory and subdirectories?
我有一种情况,我需要沿着特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有 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
之间有两个斜杠无法与 .java
根目录下的文件匹配=16=]
如果 foo
目录始终位于您要搜索的目录的根目录,我建议使用 /foo/**.java
,否则 **/foo/**.java
。
我有一种情况,我需要沿着特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有 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
之间有两个斜杠无法与 .java
根目录下的文件匹配=16=]
如果 foo
目录始终位于您要搜索的目录的根目录,我建议使用 /foo/**.java
,否则 **/foo/**.java
。