Estou tentando encontrar um arquivo que não existe no meu diretório pessoal e em todos os subdiretórios.
find ~/ -name "bogus"
fornece essas informações após alguns segundos, mas o gerenciador de dolphin
arquivos do KDE 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?
find
performance
dolphin
Vermelho
fonte
fonte
locate
mais frequentemente do quefind
e é mais rápido em uma pasta enormelocate
seja realmente ótimo para encontrar arquivos, isso é um pouco obsoleto, porque usa uma abordagem completamente diferente:find
e ferramentas da GUIDolphin
estão percorrendo a árvore de arquivos sob demanda, enquantolocate
usam uma estrutura de índice criada anteriormente.Respostas:
Olhando especificamente para o Dolphin com o Baloo, 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. Quando eu rastrear o
file.so
processo, eu vejo as chamadas paralstat
,getxattr
egetxattr
mais uma vez para cada arquivo, e até mesmo para..
entradas. Essas chamadas do sistema recuperam metadados sobre o arquivo 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 os metadados.find
é muito mais inteligente. Ele tenta evitar chamadas desnecessárias ao sistema. Ele não ligagetxattr
porque não pesquisa com base em atributos estendidos. Ao percorrer um diretório, pode ser necessário chamarlstat
nomes de arquivos não correspondentes, porque esse pode ser um subdiretório para pesquisar recursivamente (lstat
é a chamada do sistema que retorna os metadados do arquivo, incluindo o tipo de arquivo como regular / directory / symlink /…). No entanto,find
possui 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
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 do diretório, para quefind
nem precise ligarlstat
se essa é a única informação necessária.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 das informações (por exemplo, porque o arquivo foi excluído por uma condição anterior). correspondente no nome).Suspeito que outras ferramentas de pesquisa da GUI que reinventem a
find
roda sejam igualmente menos inteligentes que o utilitário de linha de comando que passou por décadas de otimização. 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).fonte
2 + number of sub-directories.
Isso funciona para sistemas de arquivos que implementam o bug de design do sistema de arquivos UNIX V7, mas não para todos os sistemas de arquivos, pois esse não é um requisito do POSIX. . Se você deseja obter um número de desempenho útil para o GNU make, é necessário especificar-noleaf
para que o GNU make se comporte corretamente.find
pode ter esse bug há muito tempo, mas duvido que você encontre um caso em que precise especificar-noleaf
manualmente hoje em dia. AFAICT, pelo menos no Linuxgetdents()
(e readdir ()) informa quais arquivos são arquivos de diretório em UDF, ISO-9660, btrfs que não possuem entradas reais.
ou se comportam bem lá. Você conhece um caso em que o GNU apresenta o problema?..
find
find
find
. E, de qualquer forma,strace -v
mostra quegetdents()
retorna corretamente d_type = DT_DIR para diretórios, para que o GNU find não precise usar o truque de contagem de links.