Procura recursivamente pasta mas exclui subpasta svn

10

Eu quero encontrar todas as ocorrências de foo em um sistema de arquivos grande mantido pelo SVN, mas não quero corresponder nada contido em qualquer diretório .svn .

Eu recebo correspondências imediatas quando faço grep -l -e 'foo' * , mas quando tento excluir os diretórios svn com grep -l -e 'foo' --exclude-dir=".svn" , o comando simplesmente trava.

O que estou fazendo de errado?

    
por Anthony Elliott 02.04.2012 / 19:41

5 respostas

11

--exclude-dir não substitui a necessidade de listar arquivos na linha de comando. Você está "pendurado" porque grep está aguardando a entrada padrão.

grep -l -e 'foo' --exclude-dir=".svn" *

Considere usar ack , que exclui .svn e pastas semelhantes (e tem muitos outros recursos) por padrão.

    
por 02.04.2012 / 19:47
5

Você pode estar interessado em ack . Ele faz buscas recursivas (e outras operações semelhantes ao grep) e exclui diretórios como .svn ou .git por padrão.

    
por 02.04.2012 / 20:45
2

A solução grep --exclude-dir... deve ser boa, mas só para mostrar outra maneira, você pode fazer isso com find ' -prune :

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

Se você quiser executar algo mais, find é melhor que um grep -r :

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;
    
por 02.04.2012 / 20:08
1

Se você não quiser entrar em diretórios como .svn ever , é possível definir a variável $GREP_OPTIONS para excluí-la, conforme abaixo:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

Basta adicionar essa linha ao seu .bashrc e seus greps recursivos não entrarão mais em .svn diretórios. Claro, pode ser tão rico quanto você quiser:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"
    
por 25.10.2012 / 21:28
0

Aqui está uma solução awk também:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

Basicamente, de todos os arquivos, apague aqueles que combinam com /.svn/ e, desses, imprima apenas aqueles que combinam / foo /. Eu também gosto dessa solução, pois você pode facilmente usar os resultados com ls. Por exemplo, você pode usar

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

para ver uma exibição de lista classificada por data de modificação. Além disso, é bom ter o caminho completo dos resultados se você quiser fazer outra coisa com eles (abri-los, executar, etc.)

    
por 02.04.2012 / 20:43

Tags