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.