grep apenas subdiretórios que correspondem ao padrão

9

Eu tenho uma árvore de diretórios que consiste em vários milhares de subdiretórios, mas frequentemente preciso cumprimentar apenas um pequeno subconjunto desses diretórios. Como posso grepapenas os subdiretórios que correspondem a um padrão?

Por exemplo, suponha que eu tenha esses subdiretórios nos quais eu quero grep:

...
...
...
/foo
/fooLib
/fooHandler
/fooGizmo
...
...
...

As ...entradas acima representam os milhares de outros diretórios nos quais não quero entrar.

Supondo que eu esteja procurando por todas as instâncias de bar, se eu fizer isso:

grep -n --recursive bar *

Eu encontraria o que estou procurando, mas em todos os diretórios. Como posso pesquisar apenas nos subdiretórios que correspondem ao padrão foo*?

John Dibling
fonte
Deseja pesquisar apenas em /fooamigos? Em /fooe /foo/bare /foo/bar/quxe assim por diante, mas não /wibble/foo? Dentro /fooe /wibble/foomas não /foo/bar? Em /fooe /foo/bare /wibble/foomas não /elsewhere?
Gilles 'SO- stop be evil'

Respostas:

11

Você pode usar grep e encontrar a combinação como abaixo:

find /{foo,fooLib,fooHandler,fooGizmo} -type f -exec grep -l "test" {} \;

Ou você pode usar

find /foo* -type f -exec grep -l "test" {} \;

Ou usando apenas grep

grep -R "test" /foo*
Rahul Patil
fonte
Posso fazer isso sem especificar explicitamente os subdiretórios? Em vez disso, usando um curinga como foo*?
precisa saber é o seguinte
@JohnDibling sim eu ter atualizado exatamente o que você está dizendo :)
Rahul Patil
A última sugestão ( grep -R "test" /foo*) é exatamente o que estou fazendo agora, então vou aceitar.
precisa saber é o seguinte
Obrigado por isso. Estou usando o primeiro padrão, mas gostaria de entender algumas coisas sobre ele - por exemplo, o que fazem o final {}e a barra invertida?
random_user_name
Isso fornece as linhas correspondentes ao grep, mas o local dos dados (o arquivo em que está) é perdido. Existe alguma maneira de reter isso?
Jontia
0

tente, grep foo* <other parts>por exemplo:grep foo* -name "book*"

harish.venkat
fonte
Se eu estou procurando por todas as instâncias de bartodos os arquivos nos subdiretórios nomeados foo*, deve ser assim grep --recursive bar ./foo*/*:?
precisa saber é o seguinte