Estou tentando encontrar um arquivo que não existe no meu diretório inicial e em todos os subdiretórios.
find ~/ -name "bogus"
me dá essa informação depois de alguns segundos, mas o gerenciador de arquivos do KDEdolphin
precisou de quase 3 minutos para fazer o mesmo. Isso corresponde à minha experiência anterior com o GNOMEbeagle
.
Como find
consegue fazer o mesmo muito rápido enquanto a pesquisa gráfica (que é mais intuitiva de usar do que os parâmetros da linha de comando) fica para trás?
Olhando para o Dolphin com Baloo especificamente, parece procurar os metadados de cada arquivo em seu domínio de pesquisa, mesmo se você estiver fazendo uma pesquisa simples de nome de arquivo. Ao rastrear o
file.so
processo, vejo chamadas paralstat
,getxattr
egetxattr
novamente para cada arquivo e até mesmo para..
entradas. Essas chamadas de sistema recuperam metadados sobre o arquivo que está armazenado em um local diferente do nome do arquivo (o nome do arquivo é armazenado no conteúdo do diretório, mas os metadados estão no inode ). Consultar os metadados de um arquivo várias vezes é barato, pois os dados estariam no cache do disco, mas pode haver uma diferença significativa entre consultar os metadados e não consultar os metadados.find
é muito mais inteligente. Ele tenta evitar chamadas de sistema desnecessárias. Ele não chamarágetxattr
porque não pesquisa com base em atributos estendidos. Quando está percorrendo um diretório, pode ser necessário chamarlstat
nomes de arquivo não correspondentes porque pode ser um subdiretório para pesquisar recursivamente (lstat
é a chamada do sistema que retorna metadados de arquivo, incluindo o tipo de arquivo, como regular/diretório/link simbólico/…). No entantofind
, tem uma otimização: ele sabe quantos subdiretórios um diretório possui a partir de sua contagem de links e para de chamarlstat
quando sabe que percorreu todos os subdiretórios. Em particular, em um diretório folha (um diretório sem subdiretórios),find
verifica apenas os nomes, não os metadados. Além disso, alguns sistemas de arquivos mantêm uma cópia do tipo de arquivo na entrada do diretório, para quefind
nem precise chamarlstat
se essa for a única informação de que precisa.Se você executar
find
com opções que exigem a verificação dos metadados, ele fará maislstat
chamadas, mas ainda não fará umalstat
chamada em um arquivo se não precisar da informação (por exemplo porque o arquivo foi excluído por uma condição anterior correspondente no nome).Suspeito que outras ferramentas de pesquisa de GUI que reinventam a
find
roda sejam igualmente menos inteligentes do que o utilitário de linha de comando que passou por décadas de otimização. Dolphin, pelo menos, é inteligente o suficiente para usar o banco de dados de localização se você pesquisar “em todos os lugares” (com a limitação que não está clara na interface do usuário de que os resultados podem estar desatualizados).