Por que o GNU é tão rápido em comparação com os utilitários de pesquisa de arquivos gráficos?

48

Estou tentando encontrar um arquivo que não exista em meu diretório pessoal e em todos os subdiretórios.

find ~/ -name "bogus" me dá essa informação depois de alguns segundos, mas o gerenciador de arquivos dolphin do KDE precisava quase 3 minutos para fazer o mesmo. Isso corresponde à minha experiência anterior com GNOME beagle .

Como o find consegue fazer o mesmo muito rápido enquanto a busca gráfica (que é mais intuitiva para usar do que os parâmetros de linha de comando) slugs atrás?

    
por Red 09.05.2018 / 10:33

1 resposta

68

Olhando especificamente para o Dolphin com Baloo, parece procurar os metadados de todos os arquivos em seu domínio de pesquisa, mesmo que você esteja fazendo uma simples pesquisa de nome de arquivo. Quando eu rastreio o processo file.so , vejo as chamadas para lstat , getxattr e getxattr novamente para cada arquivo e até mesmo para .. entradas. Essas chamadas de sistema recuperam metadados sobre o arquivo que é 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, já que os dados estariam no cache de 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 desnecessárias do sistema. Não chamará getxattr porque não pesquisa com base em atributos estendidos. Quando estiver percorrendo um diretório, pode ser necessário chamar lstat em nomes de arquivo não correspondentes, pois 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 / directory / symlink /…). No entanto, find tem uma otimização: ele sabe quantos subdiretórios um diretório possui de seu contagem de links , e ele pára de chamar lstat uma vez que ele saiba que ele percorreu todos os subdiretórios. Em particular, em um diretório de folhas (um diretório sem subdiretórios), find apenas verifica os nomes, não os metadados. Além disso, alguns sistemas de arquivos mantêm uma cópia do tipo de arquivo na entrada de diretório, de modo que find nem precise chamar lstat 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 produzirá mais lstat chamadas, mas ainda não fará uma chamada de lstat em um arquivo se não precisar das informações (por exemplo, porque o arquivo é excluído por uma condição anterior correspondente ao nome).

Eu suspeito que outras ferramentas de busca da GUI que reinventam a roda find são similarmente menos inteligentes do que o utilitário de linha de comando que passou por décadas de otimização. O Dolphin, pelo menos, é inteligente o bastante 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 IU de que os resultados podem estar desatualizados).

    
por 09.05.2018 / 12:31