Pode parecer que estou fazendo a mesma coisa que esta pergunta , mas tenho requisitos diferentes. Este é um exemplo do meu sistema de arquivos:
- /código/
- interno/
- dev /
- a Principal/
- público/
- dev /
- a Principal/
- liberação/
- Ferramentas/
- interno/
/code/internal/dev/
, /code/public/dev/
E /code/tools/
conter subdirectórios para múltiplos projectos. Eu trabalho quase exclusivamente nas ramificações de desenvolvimento de /code/internal/
e /code/public/
, e geralmente desejo pesquisar uma sequência de texto nesses diretórios junto com /code/tools/
(que não possui ramificações). Nesses casos, tenho que executar três comandos separados:
$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/
Eu gostaria de saber se existe um único comando para fazer isso. Caso contrário, eu provavelmente precisaria escrever um script bash simples.
grep: /code/internal/dev/*.cs: No such file or directory
menos que eu remova*.cs
o comando. A culpa é minha, porque eu coloquei a*.cs
pergunta originalmente.Se você deseja fazer o máximo uso de curingas (e a hierarquia que você postou estiver completa), você pode
Explicação:
O primeiro passo é a expansão da lista entre chaves.
foo{bar,baz}qux
expande parafoobarqux 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, fazendoquais saídas
Observe que isso também funciona com vários chavetas e também com argumentos vazios; por exemplo
dá
Portanto, após a expansão da chave, seu comando fica assim:
O próximo passo é a expansão de caracteres curinga. Você já sabe disso
*.cs
, mas também funciona para diretórios intermediários; além disso, se/
segue, apenas os diretórios são correspondidos. Portanto, dada sua hierarquia (e criando nomes de.cs
arquivos), você obterá o comando:Somente depois que tudo isso aconteceu,
grep
é chamado com esta lista de argumentos (observe que o mesmo acontece com seus comandos originais;grep
nunca chega a ver a*
; expansão que é completamente feitabash
antes de chamargrep
).fonte