Alternativas mais rápidas para “encontrar” e “localizar”?

15

Eu gostaria de usar "localizar" e localizar "para procurar por arquivos de origem no meu projeto, mas eles demoram muito para serem executados. Há alternativas mais rápidas para esses programas que eu não conheço ou maneiras de acelerar o desempenho desses programas?

    
por benhsu 29.09.2011 / 15:15

5 respostas

14

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 lugar, talvez em alguns subdiretórios aninhados com não mais que dois ou três, para que você possa usar um comando (possivelmente) mais rápido, como

(cd /path/to/project; ls *.c */*.c */*/*.c)

Use os metadados do projeto

Em um projeto C, você normalmente teria um Makefile. Em outros projetos, você pode ter algo parecido. Estas podem ser uma maneira rápida de extrair uma lista de arquivos (e seus locais) escrever um script que faz uso dessas informações para localizar arquivos. Eu tenho um script de "fontes" para poder escrever comandos como grep variable $(sources programname) .

Acelerando a localização

Pesquise menos lugares, em vez de find / … use find /path/to/project … , sempre que possível. Simplifique os critérios de seleção tanto quanto 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 o parâmetro -maxdepth. Por exemplo, '-maxdepth 5'

Acelerando a localização

Assegure-se de indexar os locais nos quais você está interessado. Leia a página de manual e faça uso de quaisquer opções apropriadas à sua tarefa.

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

Remova a necessidade de pesquisar

Talvez você esteja pesquisando porque esqueceu de onde algo está 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.

    
por 29.09.2011 / 17:24
8

Eu usei a parte "acelerando a localização" da resposta da RedGrittyBrick. Eu criei um banco de dados menor:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

apontou locate para ele: locate -d /home/benhsu/ben.db

    
por 29.09.2011 / 22:48
4

Uma tática que eu uso é aplicar a opção -maxdepth com find :

find -maxdepth 1 -iname "*target*"

Repita com profundidades crescentes até encontrar o que procura ou se cansa de procurar. As primeiras iterações provavelmente retornarão instantaneamente.

Isso garante que você não perca tempo antecipadamente observando as profundezas de grandes subárvores quando o que você está procurando tem mais chances de estar perto da base da hierarquia.

Aqui está um script de exemplo para automatizar este processo (Ctrl-C quando você vê o que você quer):

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

Observe que a redundância inerente envolvida (cada passe terá que atravessar as pastas processadas em passadas anteriores) será amplamente otimizada através do cache de disco.

Por que find não tem esse pedido de pesquisa como um recurso interno? Talvez porque seria complicado / impossível implementar se você assumisse que a passagem redundante era inaceitável. A existência da opção -depth sugere a possibilidade, mas infelizmente ...

    
por 18.09.2015 / 22:57
1

Outra solução fácil é usar a globalização de concha estendida mais recente. Para ativar:

  • bash: shopt -s globstar
  • ksh: set -o globstar
  • zsh: já ativado

Em seguida, você pode executar comandos como este no diretório de origem de nível superior:

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

Isso tem a vantagem de pesquisar recursivamente por todos os subdiretórios e é muito rápido.

    
por 25.08.2017 / 09:11
0

O Arqueiro 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, algumas das saídas do meu apt show silversearcher-ag :

  • Pacote : silversearcher-ag
  • Mantenedor : Hajime Mizuno
  • Página inicial : link
  • Descrição : programa muito rápido semelhante ao grep, alternativa ao ack-grep O Silver Searcher é um programa parecido com o grep implementado por C. Uma tentativa de fazer algo melhor que o ack-grep. Ele procura um padrão de 3 a 5 vezes mais rápido que o ack-grep. Ele ignora os padrões de arquivo do seu .gitignore e do .hgignore.

    
por 08.07.2017 / 06:01