
Preciso procurar em uma grande árvore de diretórios por um grande número de nomes de arquivos possíveis, ou seja, tenho um arquivo de entrada com uma longa lista de strings que preciso encontrar na árvore (ou como abaixo: imprima todas aquelas que não estão na árvore)
Como uma solução baseada em sistema de arquivos, posso fazer algo assim:
while read a;
do
count=`find /path/to/dir -name "*$a*" | wc -l`; ;
if [ $count -eq 0 ];
then
echo $a;
fi
done < inputnames.txt
o que é extremamente ineficiente, dado o tamanho da árvore e o tamanho do arquivo de entrada. Então pensei que poderia simplesmente despejar a saída find
em um arquivo
find /path/to/dir > pathtodir_tree.txt
e então grep o arquivo.
while read a;
do
count=`grep $a pathtodir_tree.txt | wc -l`;
if [ $count -eq 0 ];
then
echo $a;
fi
done < inputnames.txt
o que é muito mais rápido. Minhas perguntas são: estou faltando uma solução baseada em sistema de arquivos mais eficiente? Caso contrário, existe outra solução que seja mais eficiente (ou geralmente melhor) do que a solução baseada em grep que estou propondo?
Responder1
Isto funciona para mim (se você quiser encontrar esses arquivosnãoCoincidindo; caso contrário, omita v da opção grep):
find /path/to/dir > tree.txt
grep -vf inputnames.txt tree.txt
E se você quiser saber quantos são:grep -vf inputnames.txt tree.txt | wc -l
Isso localiza/conta todas as ocorrências em tree.txt que fazemnãocorresponder a qualquer string em inputnames.txt
.