Você pode concatenar vários caminhos para o grep procurar:
grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
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/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.
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
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}
dá
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
).