ver texto por ejemplos contenido consola comandos comando buscar basicos archivos archivo java regex file command-line grep

java - texto - Buscar archivos en el directorio que tienen una de dos palabras clave



comandos linux (1)

Mi servidor Linux tiene un directorio que contiene muchos otros subdirectorios, que contiene archivos nombrados con palabras clave. Por ejemplo:

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

Necesito crear un método que devuelva una lista de todos los archivos que contengan una de dos palabras clave. Por ejemplo:

findFiles("keyword11", "keyword42");

Debería devolver los siguientes archivos del ejemplo anterior:

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

Estoy pensando en crear un método recursivo que pruebe si el nombre de cada archivo contiene una de las dos palabras clave. Pero me temo sobre el rendimiento, porque los directorios tienen miles de archivos y subdirectorios. Y habrá más y más archivos que se crearán todos los días.

Me gustaría saber cuál sería la forma correcta de hacerlo. ¿Debo usar el file.getName().contains() ? ¿Debería usar Regex? ¿O debería usar un comando de linux como grep?


Puede usar FileVisitor, es muy conveniente.

Aquí está el ejemplo:

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(); } } }

Si desea hacer smth con directorios, use los métodos preVisitDirectory y postVisitDirectory para hacer smth antes y después de visitar un directorio.