Pesquise recursivamente a pasta, mas exclua a subpasta svn


10

Quero encontrar todas as ocorrências de fooum sistema de arquivos grande 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 errado?

Respostas:


11

--exclude-dirnão suplanta a necessidade de listar arquivos na linha de comando. Você está "travando" porque grepestá aguardando a entrada padrão.

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

Considere usar ack , que exclui .svnpastas semelhantes (e possui muitos outros recursos) por padrão.


2
Mais limpo se você mudar *para ., caso haja outras pastas ocultas que devem ser pesquisadas.
Kevin

ou talvez você queira usar --recursive ., já que o OP já possui o GNU grep.
Jw013

Pessoalmente, eu tenho shopt -s dotglobno Bash, então *já contém arquivos de ponto. -ré agradável, mas ackfaz isso por padrão também :)
ephemient

5

Você pode estar interessado em ack . Faz pesquisa recursiva (e outras operações do tipo grep) e exclui diretórios como .svn ou .git por padrão.


Como um acompanhamento sobre isso, eu uso atualmente ag, que semelhante, mas mais rápido.
WhyNotHugo

2

A grep --exclude-dir...solução deve ser boa, mas apenas 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ê deseja executar algo mais, findé melhor que um simples grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

Se você não deseja grep em diretórios como .svn nunca, pode definir a $GREP_OPTIONSvariável para excluí-la da seguinte forma:

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

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

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

1
Pessoalmente, faço isso usando um alias para que eu possa ignorar a lista de exclusão, se eu realmente precisar pesquisar dentro dessas pastas; eu posso apenas usar o grep sem precisar desmarcar / anular a variável. Também me permite manter uma lista de pastas que eu posso expandir facilmente e adicionei automaticamente à minha lista de exclusões sem precisar digitar mais.
precisa saber é o seguinte

Essa é uma boa abordagem. Também tem a vantagem de que, se você precisar fazer grep nas pastas, não esquecerá de definir uma variável. (Não que eu tinha já precisou grep-los.) Mas TBH estes dias eu uso ag (um clone ack) para estas coisas ^^
Brandizzi

0

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

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

Basicamente, de todos os arquivos, remova aqueles que correspondem a /.svn/ e, em seguida, imprima apenas aqueles que correspondem a / foo /. Também gosto desta solução, pois você pode usar facilmente os resultados com ls. Por exemplo, você pode usar

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

para ver uma exibição em 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 (abra-os, execute etc.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.