Pode parecer que estou perguntando a mesma coisa que esta pergunta , mas Tenho diferentes requisitos. Este é um exemplo do meu sistema de arquivos:

  • / code /
    • interno /
      • dev /
      • principal /
    • public /
      • dev /
      • main /
      • release /
    • ferramentas /

/code/internal/dev/, /code/public/dev/ e /code/tools/ contêm subdiretórios para vários projetos. Trabalho quase exclusivamente nos ramos dev de /code/internal/ e /code/public/, e muitas vezes eu quero pesquisar uma string de texto nesses diretórios junto com /code/tools/ (que não tem ramificações). Nesses casos, 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 há um único comando para fazer isso. Caso contrário, provavelmente precisaria escrever um script bash simples.

A nswer

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

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

Comentários

  • Isso é tão óbvio. Por que ' não pensei nisso ?!
  • Na verdade, isso gera um erro grep: /code/internal/dev/*.cs: No such file or directory a menos que eu remova o *.cs a partir do comando. A culpa é minha porque coloquei a *.cs em minha pergunta originalmente.

Resposta

Se quiser usar ao máximo os curingas (e a hierarquia postada estiver completa), você pode fazer

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

Explicação: / h1>

A primeira etapa feita é a expansão da lista entre chaves. foo{bar,baz}qux se expande para foobarqux foobazqux. Ou seja, há “uma palavra separada gerada para cada item separado por vírgulas na lista, com a parte do prefixo e do postfix anexados a cada um. Você pode ver como isso funciona fazendo

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

que produz

A1B A2B A3B A4B 

Observe que isso também funciona com vários colchetes 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 

Portanto, após a expansão da chave, seu comando fica assim:

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

A próxima etapa é a expansão do curinga. Você já sabe disso para a parte *.cs, mas também funciona para diretórios intermediários; além disso, se um / segue, apenas os diretórios são correspondidos. Portanto, dada a sua hierarquia (e criando nomes de arquivo para os .cs arquivos), você ” vou 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 que tudo isso aconteceu, grep é chamado com esta lista de argumentos umentos (observe que o mesmo acontece com seus comandos originais; grep nunca consegue ver o *; a expansão é feita completamente por bash antes de chamar grep).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *