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

6

Estou pesquisando por meio de um aplicativo Ruby on Rails uma palavra usando grep no 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 funcionaria:

  • i - pesquisa insensível a maiúsculas e minúsculas
  • n - número da linha de impressão em que o padrão é encontrado
  • R - pesquisa recursivamente
  • w - Eu só quero palavras inteiras - ou seja, corresponder "direto", mas não "diretório"
  • -E - use expressão regular estendida
  • 'direct' - a expressão regular que eu quero corresponder
  • . - pesquisa no diretório atual
  • - exclude-dir -E 'git | log | ativo' - exclui diretórios que correspondam a git ou log ou asset.

Em termos dos diretórios exclude, o comando ainda busca os diretórios './git' e './ log' , bem como em < strong> './ app / assets'

Eu obviamente não tenho conhecimento fundamental, mas não sei o que é.

    
por Steven L. 12.05.2016 / 02:10

2 respostas

4

--exclude-dir não entende | .

Você pode, no entanto, obter o mesmo efeito especificando --exclude-dir várias vezes, uma para cada diretório que deseja excluir:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
    
por 12.05.2016 / 02:21
4

A descrição da página de manual para essa opção é meio enganosa ... Seu padrão, como em globs , não é padronizado como em regex . Por info page :

--exclude-dir=GLOB

Skip any command-line directory with a name suffix that matches the pattern GLOB. When searching recursively, skip any subdirectory whose base name matches GLOB. Ignore any redundant trailing slashes in GLOB.

Então, no seu caso, você pode executar:

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

para excluir os diretórios denominados git , log e assets ou, por exemplo,

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

para excluir nomes de diretório que terminem em git ou iniciem com asset .

    
por 12.05.2016 / 02:23