Grep em arquivos com uma extensão específica em um diretório

11

Existe um comando que permita pesquisar uma palavra-chave em arquivos em um diretório com extensão específica?

A corda grep -irn "string" ./pathdá uma pesquisa recursiva para todos os arquivos no diretório ./path. Meu requisito específico é procurar em todos os arquivos ./pathcom uma extensão como*.h

Ginu Jacob
fonte

Respostas:

11

Depois de alguns testes, acho grep -irn 'string' --include '*.h'mais útil

Ginu Jacob
fonte
1
Se você fizer isso, não se esqueça de colocar as "*.h"aspas.
G-Man diz 'Restabelecer Monica'
Funciona com e sem aspas
Ginu Jacob 8/16
3
Agora sim. Tente criar um arquivo chamado foobar.hno diretório atual e tente novamente.
G-Man Diz 'Reinstate Monica
10

S et (ligar) a sh ell opt iónica globstarcom o comando

    shopt -s globstar

Isso fará com que, **como componente do nome do arquivo, signifique tudo aqui e abaixo. Isso path/**significa tudo no pathdiretório e seus subdiretórios . (Você não precisa digitar ./aqui.) Em seguida, você pode usar

grep -in "string" path/**/*.h

para pesquisar todos os .harquivos dentro e abaixo path.


Você pode u Nset opções com shopt -u.

G-Man diz que 'restabelece Monica'
fonte
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ipor Sircer
fonte
1
-exec... +é bom também.
G-Man diz 'Restabelecer Monica'
1
Acabei de notar - você esqueceu de incluir "string"na sua resposta!
G-Man diz 'Restabelecer Monica
3

Se você pode instalar algo em sua máquina, sugiro usar o ack .

Você pode fazer exatamente o que precisa com ele e muito mais. Para o seu caso de uso, você pode:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filtra em arquivos h
  • -i ignora o caso

Para saber quais filtros de arquivo são suportados nativamente, execute o comando ack --help=type.

DE ANÚNCIOS
fonte
Há também ag , um ex-clone de ack. Primeiro, porque seus conjuntos de recursos divergiram um pouco.
8bittree
Eu não conhecia ag. Obrigado por compartilhar.
AD
3

Que tal este?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Explicação:

  • -L: siga links simbólicos
  • -name: usando o asterisco, você pode descrever extensões
  • -in: igual à sua proposta, mas o 'r' é substituído pelo findcomando
  • {}: significa o resultado do findcomando
  • \; : caso você combine findcom -exec, este é o especificador de fim de comando
Dominique
fonte
1
Como "*.h"funciona? Eu teria pensado que precisava ser'*.h'
Joe
Eu sempre trabalho com aspas duplas, acho que não faz diferença.
Dominique
0

Se você estiver usando o gnu grep, ele possui uma bandeira que faz exatamente o que você deseja:

grep -irn --include=\*.h "string" path

embora eu não ache que esteja disponível em outros greps.

plnu
fonte