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

Respostas:



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.



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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.