grep recursivo: exclui diretórios específicos

45

Eu uso muito o grep recursivo para encontrar arquivos fonte com conteúdo específico.

grep -Rni "myfunc" .

Em bases de código grandes, isso pode ficar lento, então eu uso --incldue para restringir / extensões de lista branca.

grep -Rni --include=*.java "myfunc" .

No entanto, seria mais eficiente excluir (remover) subdiretórios inteiros, estou pensando:

grep -Rni --exclude=/.svn/ "myfunc" .

Mas o --exclude suporta apenas padrões de arquivo como * .java acima. Como posso excluir diretórios?

    
por gabor 06.11.2009 / 15:48

6 respostas

10

Você pode procurar em ack .

Acabei de começar a usá-lo, mas parece bem adequado para isso.

    
por 15.12.2009 / 21:34
57
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

Fonte: link

    
por 23.05.2017 / 14:41
6

você pode usar a localização:

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print

OK, então é um pouco para trás, você obtém os resultados do grep primeiro e então o caminho. Talvez alguém mais tenha uma resposta melhor?

    
por 06.11.2009 / 13:55
2

Aqui está um exemplo completo de um script em um dos meus projetos que podem ajudar, eu chamo esse arquivo de "all_source" (marcado como executável) e o coloco no diretório raiz do meu projeto e o chamo como grep myfunc $(./all_source) do tipo no final do roteiro é totalmente opcional.

#!/bin/bash

find . \
    -type d \( \
            -wholename './lib' -o \
            -wholename './vc6' -o \
            -name 'gen' -o \
            -name '.svn' \
            \) -prune -o \
    -type f \( \
            -name '*.h' -o \
            -name '*.cpp' -o \
            -name '*.c' -o \
            -name '*.lua' -o \
            -name '*.*awk' \) -print \
    | sort

Esse script retorna todos os nomes de arquivo no projeto que correspondem a *.h, *.cpp, *.c, *.lua, *.*awk , mas não pesquisa em todas as pastas chamadas .svn e gen, além de pular as pastas para ./lib e ./vc6 (mas apenas os que estão fora da raiz do projeto). Então, quando você faz o grep myfunc $(./all_source) , ele só usa esses arquivos. Você precisará chamar isso do diretório raiz do projeto também.

    
por 15.12.2009 / 21:51
0

Existe também a opção -prune para encontrar:

 find . -path "*/.svn*" -prune -o -not -type d -exec grep -ni "myfunc" {} \; -print
    
por 15.12.2009 / 21:26
0

Você pode tentar fazer isso:

grep -R  "myfunc" . | grep -v path_to_exclude/

Por exemplo: se você não quiser pesquisar o conteúdo em arquivos de log, faça o seguinte:

grep -R "myfunc" . | grep -v log/
    
por 29.02.2016 / 23:46