Quero encontrar todas as ocorrências foo
em um grande sistema de arquivos mantido pelo SVN, mas não quero corresponder a nada contido em nenhum .svn
diretório.
Recebo correspondências imediatas quando faço isso, 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?
Responder1
--exclude-dir
não substitui a necessidade de listar arquivos na linha de comando. Você está "travando" porque grep
está aguardando entrada padrão.
grep -l -e 'foo' --exclude-dir=".svn"*
Considere usarack, que exclui .svn
pastas semelhantes (e tem muitos outros recursos) por padrão.
Responder2
Você pode estar interessado emack. Ele faz pesquisas recursivas (e outras operações semelhantes ao grep) e exclui diretórios como.svnou.gitpor padrão.
Responder3
A grep --exclude-dir...
solução deve funcionar bem, mas só para mostrar outra maneira, você pode fazer isso com find
's -prune
:
find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +
Se você quiser executar algo mais, find
é melhor que um simples grep -r
:
find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;
Responder4
Se você não quiser entrar em diretórios como.svn
semprevocê pode definir a $GREP_OPTIONS
variável para excluí-la conforme abaixo:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"
Basta adicionar esta linha ao seu .bashrc
e seus greps recursivos não entrarão mais nos .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=\*~"