Pesquise recursivamente a pasta, mas exclua a subpasta svn

Pesquise recursivamente a pasta, mas exclua a subpasta svn

Quero encontrar todas as ocorrências fooem um grande sistema de arquivos mantido pelo SVN, mas não quero corresponder a nada contido em nenhum .svndiretó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-dirnão substitui a necessidade de listar arquivos na linha de comando. Você está "travando" porque grepestá aguardando entrada padrão.

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

Considere usarack, que exclui .svnpastas 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_OPTIONSvariável para excluí-la conforme abaixo:

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

Basta adicionar esta linha ao seu .bashrce seus greps recursivos não entrarão mais nos .svndiretórios. Claro, pode ser tão rico quanto você quiser:

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

informação relacionada