Usando grep com o sinalizador --exclude-dir para excluir vários diretórios

15

Estou pesquisando em um aplicativo Ruby on Rails uma palavra usando grepno OSX e gostaria de excluir diretórios que correspondam a um determinado padrão.

Estou usando o seguinte comando:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

Este comando não está fazendo o que eu pensei que faria. Aqui está como eu pensei que iria funcionar:

  • i - pesquisa sem distinção entre maiúsculas e minúsculas
  • n - imprime o número da linha na qual o padrão é encontrado
  • R - pesquisa recursivamente
  • w - só quero palavras inteiras - ou seja, corresponda "direct", mas não "directory"
  • -E - use expressão regular estendida
  • 'direct' - a expressão regular que quero corresponder
  • . - pesquisa no diretório atual
  • --exclude-dir -E 'git | log | asset' - exclui diretórios que correspondem ao git ou log ou ativo.

Em termos de diretórios de exclusão, o comando ainda acaba pesquisando nos diretórios './git' e './log' , bem como em './app/assets'

Obviamente, não tenho um conhecimento fundamental, mas não sei o que é.

Steven L.
fonte

Respostas:

16

A descrição da página de manual para essa opção é meio enganosa ... É padrão como em globs, não padrão como em regex . Pela infopágina :

--exclude-dir = GLOB

Pule qualquer diretório da linha de comandos com um sufixo de nome que corresponda ao padrão GLOB. Ao pesquisar recursivamente, pule qualquer subdiretório cujo nome base corresponda ao GLOB. Ignore as barras finais redundantes no GLOB.

Portanto, no seu caso, você pode executar:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

para excluir diretórios nomeados git, loge assetsou, por exemplo

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

excluir nomes de diretório que terminam em gitou começam com asset.

don_crissti
fonte
Muito interessante. Acho que deveria procurar o que é uma glob.
Steven L.
Sinto muito, mas nenhum deles parece estar funcionando. Ajudaria se eu dissesse que estou usando esta versão do grep: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.
Estou perplexo porque estou lendo o manual do bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) e não há menção a --exclude-dir. Vaia.
Steven L.
2
OK - eu vejo o problema agora. Deve ser uma versão modificada do grep usada apenas pelo sistema Apple. Estou no Mac OS X. Sinto muito pela confusão aqui. Tenho certeza de que há um fórum em outro lugar no stackexchange no qual posso postar.
Steven L.
@ user245185 você está no BSD ou no OSX? Ambos estão no tópico aqui, mas edite sua pergunta e diga-nos qual sistema operacional você está usando. Os comportamentos das ferramentas padrão diferem entre as implementações conforme você descobre.
terdon
8

--exclude-dirnão entende |.

No entanto, você pode obter o mesmo efeito especificando --exclude-dirvárias vezes, uma para cada diretório que deseja excluir:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
John1024
fonte
Funcionou para mim. Eu queria excluir o diretório inicial, mas ele não funcionou com outras opções, como --exclude-dir={home}. Eu trabalhei quando eu digitei--exclude-dir 'home'
Mubin Icyer