Melhore o desempenho do find -exec…

2

Eu preciso da lista de subdiretórios (não arquivos) em um diretório para poder passá-lo para um programa em Java. Então, estou usando este comando para obter a lista na máquina Linux:

find /some_directory -depth -maxdepth 1 -mindepth 1 -exec basename {} \; > listfile.txt

E então passo listfile.txt para o programa Java como um argumento. Existem alguns problemas para obter os diretórios de lista do próprio programa Java, portanto, estou fazendo isso. Mas o comando find acima está demorando muito tempo (~ 35 minutos), pois há mais de 200 mil arquivos.

Isso pode ser otimizado ou existe uma alternativa melhor?

    
por aamadmi 26.08.2017 / 17:35

2 respostas

10

Para imprimir apenas o nome do arquivo em vez do caminho, com GNU¹ find , você pode substituir -exec basename por -printf '%f\n' . Explicado na página man do GNU find :

%f

File's name with any leading directories removed (only the last element).

Além disso, se você quiser apenas diretórios em sua saída, você provavelmente deve usar -type d option:

find /some_directory -maxdepth 1 -mindepth 1 -type d -printf '%f\n' > listfile.txt

-depth é supérfluo, pois você só encontra arquivos em uma profundidade (1).

¹ -maxdepth e -mindepth também são extensões GNU, mas ao contrário de -printf , elas também são encontradas em outras implementações de find nos dias de hoje.

    
por 26.08.2017 / 17:40
6

Se você quiser armazenar a lista de entradas, exceto . e .. no diretório /some_directory , uma por linha, é isso que o comando ls , com a opção -A é para:

ls -A /some_directory > listfile.txt

Isso também tem o benefício de classificar essa lista (com o GNU ls , você pode desativar a classificação com -U ).

No seu caso, é muito ineficiente porque você está executando um comando basename por arquivo.

    
por 26.08.2017 / 17:53