Eu gostaria de usar "encontrar" e localizar "para procurar arquivos de origem no meu projeto, mas eles demoram muito tempo para serem executados. Existem alternativas mais rápidas para esses programas que eu não conheço ou maneiras de acelerar o desempenho desses programas?
22
locate
já deve ser bastante rápido, considerando que ele usa um índice pré-criado (a principal ressalva é que ele precisa ser atualizado), enquantofind
precisa ler as listagens de diretório.find /usr/src -name fprintf.c
na minha máquina desktop OpenBSD, ele retorna os locais desses arquivos fonte em menos de 10 segundos.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
volta em menos de um segundo. Qual é a sua definição de "muito tempo para executar" e como você usafind
elocate
?Respostas:
Procurando por arquivos de origem em um projeto
Use um comando mais simples
Geralmente, é provável que a origem de um projeto esteja em um local, talvez em alguns subdiretórios aninhados com mais de dois ou três de profundidade, para que você possa usar um comando (possivelmente) mais rápido, como
Fazer uso dos metadados do projeto
Em um projeto C, você normalmente teria um Makefile. Em outros projetos, você pode ter algo semelhante. Essa pode ser uma maneira rápida de extrair uma lista de arquivos (e seus locais). Escrever um script que utilize essas informações para localizar arquivos. Eu tenho um script "sources" para que eu possa escrever comandos como
grep variable $(sources programname)
.Acelerando a localização
Pesquise menos lugares, em vez de
find / …
usar semprefind /path/to/project …
que possível. Simplifique os critérios de seleção o máximo possível. Use pipelines para adiar alguns critérios de seleção, se isso for mais eficiente.Além disso, você pode limitar a profundidade da pesquisa. Para mim, isso melhora muito a velocidade de 'encontrar'. Você pode usar a opção -maxdepth. Por exemplo '-maxdepth 5'
Acelerando a localização
Verifique se está indexando os locais nos quais você está interessado. Leia a página de manual e use as opções apropriadas para sua tarefa.
Remova a necessidade de pesquisar
Talvez você esteja pesquisando porque esqueceu onde algo é ou não foi dito. No primeiro caso, escreva notas (documentação), no último, pergunte? Convenções, padrões e consistência podem ajudar muito.
fonte
Eu usei a parte "acelerando a localização" da resposta do RedGrittyBrick. Eu criei um db menor:
então apontou
locate
para ele:locate -d /home/benhsu/ben.db
fonte
Uma tática que eu uso é aplicar a
-maxdepth
opção comfind
:Repita com profundidades crescentes até encontrar o que está procurando ou se cansar de procurar. As primeiras iterações provavelmente retornarão instantaneamente.
Isso garante que você não perca tempo olhando as profundezas de subárvores maciças quando o que você está procurando tem maior probabilidade de estar perto da base da hierarquia.
Aqui está um exemplo de script para automatizar esse processo (Ctrl-C quando você vir o que deseja):
Observe que a redundância inerente envolvida (cada passagem terá que percorrer as pastas processadas nas passagens anteriores) será amplamente otimizada através do cache de disco.
Por que
find
essa ordem de pesquisa não possui um recurso interno? Talvez porque seria complicado / impossível de implementar se você assumisse que a travessia redundante era inaceitável. A existência da-depth
opção sugere a possibilidade, mas infelizmente ...fonte
Outra solução fácil é usar globbing de shell estendido mais recente. Para habilitar:
Em seguida, você pode executar comandos como este no diretório de origem de nível superior:
Isso tem a vantagem de pesquisar recursivamente em todos os subdiretórios e é muito rápido.
fonte
O pesquisador de prata
Você pode achar útil pesquisar muito rapidamente o conteúdo de um grande número de arquivos de código-fonte. Apenas digite
ag <keyword>
. Aqui estão alguns dos resultados do meuapt show silversearcher-ag
:Eu costumo usá-lo com:
fonte
.gitignore
arquivos e saltos.git
,.svn
,.hg
.. pastas..gitignore
e ignora arquivos ocultos e binários por padrão. Também tem mais colaboradores, mais estrelas no Github (14700 vs 8300) e já está em repositórios de distribuição de prefeitos. Forneça uma comparação confiável e atualizada de fontes de terceiros. No entanto,ripgrep
parece um ótimo software.ripgrep
qualquer forma, ele se encaixa no meu requisito, então parei de procurar outras opções..gitignore
também respeita . Dito isto,rg
é absolutamente incrível. Primeiro, ele possui suporte unicode. Na minha experiência,rg
pelo menos duas vezes mais rápido queag
(YMMV), acho que é devido ao analisador de expressões regulares de Rust, que obviamente ainda não estava pronto nos anos anterioresag
.rg
pode fornecer uma saída determinística (mas não aparece por padrão), pode colocar na lista negra os tipos de arquivo, ondeag
só pode colocar na lista de permissões, pode ignorar arquivos com base no tamanho (registros de adeus). Ainda usoag
no caso de precisar de correspondência multilinha, o querg
não pode ser feito.Para uma substituição de localização, consulte fd . Ele possui uma interface mais simples / intuitiva do que o comando find original e é um pouco mais rápido.
fonte