java—在目录中查找包含两个关键字之一的文件

mefy6pfw  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(327)

我的linux服务器有一个包含许多其他子目录的目录,其中包含用关键字命名的文件。例如:

Dir1:
 -Dir1.1:
   -file-keyword11-keyword7-keyword9.txt
   -file-keyword2-keyword7-keyword97.txt
 -Dir1.2:
   -file-keyword4-keyword6-keyword9.txt
   -file-keyword2-keyword8-keyword3.txt
Dir2:
 -Dir2.1:
   -file-keyword5-keyword42-keyword2.txt
   -file-keyword8-keyword11-keyword9.txt

我需要创建一个方法来返回包含两个关键字之一的所有文件的列表。例如:

findFiles("keyword11", "keyword42");

应返回上一示例的以下文件:

-file-keyword11-keyword7-keyword9.txt
-file-keyword5-keyword42-keyword2.txt
-file-keyword8-keyword11-keyword9.txt

我正在考虑创建一个递归方法来测试每个文件的名称是否包含这两个关键字中的一个。但是我担心性能,因为目录有成千上万的文件和子目录。每天都会有越来越多的文件被创建。
我想知道怎样做才是正确的方法。我应该用吗 file.getName().contains() 方法?我应该用正则表达式吗?或者我应该使用像grep这样的linux命令?

h79rfbju

h79rfbju1#

你可以使用filevisitor,非常方便。
以下是示例:

public class FileVisitorTest {

    @Test
    public void test() throws Exception {
        String path = "D:\\downloads\\";
        findFiles(path,"apache", "Test");
    }

    public void findFiles(String path, String... keyWords) {
        try {
            Files.walkFileTree(Paths.get(path), new FileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes fileAttributes) {
                    return FileVisitResult.CONTINUE;
                }

                public FileVisitResult visitFile(Path path, BasicFileAttributes fileAttributes) {
                    for (String keyWord : keyWords) {
                        if (path.getFileName() != null && path.getFileName().toFile().getName().contains(keyWord))
                            System.out.println("File name:" + path.getFileName());
                    }

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果要对目录执行smth,请使用 preVisitDirectory 以及 postVisitDirectory 方法在访问目录之前和之后执行smth。

相关问题