查找目录中的文件有两个关键词之一(Find files in directory that have

2019-10-28 18:48发布

我的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命令?

Answer 1:

您可以使用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();
        }
    }
}

如果你想要做的不便与目录,使用preVisitDirectorypostVisitDirectory方法之前做的不便和后您访问的目录。



文章来源: Find files in directory that have one of two keywords