如何在Java中使用find命令

时间:2015-06-22 07:24:15

标签: java linux command

想知道Java中是否有查找功能。 与在Linux中一样,我们使用以下命令查找文件:

find / -iname <filename> or find . -iname <filename> 

是否有类似的方法在Java中查找文件?我有一个目录结构,需要在一些子目录和子子目录中找到某些文件。

Eg: I have a package abc/test/java 
This contains futher directories say 
abc/test/java/1/3 , abc/test/java/imp/1, abc/test/java/tester/pro etc. 

所以基本上abc / test / java包很常见,里面有很多包含很多.java文件的目录。 我需要一种方法来获取所有这些.java文件的绝对路径。

3 个答案:

答案 0 :(得分:2)

您可以使用 unix4j

Unix4jCommandBuilder unix4j = Unix4j.builder();
List<String> testClasses = unix4j.find("./src/test/java/", "*.java").toStringList();
for(String path: testClasses){
    System.out.println(path);
}

pom.xml依赖:

<dependency>
    <groupId>org.unix4j</groupId>
    <artifactId>unix4j-command</artifactId>
    <version>0.3</version>
</dependency>

Gradle依赖:

compile 'org.unix4j:unix4j-command:0.2'

答案 1 :(得分:0)

您可能不必重新发明轮子,因为名为Finder的库已经实现了Unix find命令的功能:https://commons.apache.org/sandbox/commons-finder/

答案 2 :(得分:0)

这是一个java 8片段,可以帮助您开始自己动手游戏。您可能想要阅读Files.list的警告。

public class Find {

  public static void main(String[] args) throws IOException {
    Path path = Paths.get("/tmp");
    Stream<Path> matches = listFiles(path).filter(matchesGlob("**/that"));
    matches.forEach(System.out::println);
  }

  private static Predicate<Path> matchesGlob(String glob) {
    FileSystem fileSystem = FileSystems.getDefault();
    PathMatcher pathMatcher = fileSystem.getPathMatcher("glob:" + glob);
    return pathMatcher::matches;
  }

  public static Stream<Path> listFiles(Path path){
    try {
        return Files.isDirectory(path) ? Files.list(path).flatMap(Find::listFiles) : Stream.of(path);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
  }
}