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 /
- interno /
/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
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}
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
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
).
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.