Como posso usar o grep para pesquisar vários diretórios não-aninhados?

17

Pode parecer que estou a perguntar a mesma coisa que esta questão , mas tenho requisitos diferentes. Este é um exemplo do meu sistema de arquivos:

  • / code /
    • interno /
      • dev /
      • main /
    • público /
      • dev /
      • main /
      • release /
    • ferramentas /

/code/internal/dev/ , /code/public/dev/ e /code/tools/ contêm subdiretórios para vários projetos. Eu trabalho quase exclusivamente nos ramos dev de /code/internal/ e /code/public/ , e muitas vezes eu quero procurar por uma string de texto nesses diretórios junto com /code/tools/ (que não tem ramificações). Nestas instâncias eu tenho que fazer três comandos separados:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

Gostaria de saber se existe um único comando para fazer isso. Se não, eu provavelmente precisaria escrever um script simples.

    
por David Kennedy 25.04.2014 / 17:51

2 respostas

37

Você pode concatenar vários caminhos para o grep procurar:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
    
por 25.04.2014 / 17:53
11

Se você quiser fazer o uso máximo de curingas (e a hierarquia que você postou estiver completa), você pode fazer

grep -r "some string" /code/{*/dev,tools}/*.cs

Explicação:

O primeiro passo é a expansão da lista apoiada. foo{bar,baz}qux expande para foobarqux foobazqux . Ou seja, há uma palavra separada gerada para cada item separado por vírgula na lista, com a parte do prefixo e do postfix anexada a cada um. Você pode ver como isso funciona fazendo

echo A{1,2,3,4}B

quais saídas

A1B A2B A3B A4B

Observe que isso também funciona com várias chaves e também com argumentos vazios; por exemplo

echo {,1,2}{0,1,2}:{2,3}

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

Então, após a expansão de chaves, seu comando se parece com isso:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

O próximo passo é a expansão de curingas. Você já sabe disso para a parte *.cs , mas também funciona para diretórios intermediários; Além disso, se um / for exibido, apenas diretórios serão correspondidos. Portanto, considerando sua hierarquia (e criando nomes de arquivos para os arquivos .cs ), você obterá o comando:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

Somente depois de tudo isso acontecer, grep é chamado com essa lista de argumentos (observe que o mesmo acontece com os comandos originais; grep nunca consegue ver a * ; expansão que é feita completamente por bash antes de chamar grep ).

    
por 25.04.2014 / 17:59

Tags