ti-enxame.com

grep, mas apenas certas extensões de arquivo

Eu estou trabalhando em escrever alguns scripts para grep determinados diretórios, mas esses diretórios contêm todos os tipos de tipos de arquivo.

Eu quero grep apenas .h e .cpp por enquanto, mas talvez alguns outros no futuro.

Até agora eu tenho:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

Alguém pode me mostrar como eu adicionaria agora apenas as extensões de arquivo específicas?

798
Jason

Apenas use o parâmetro --include, desta forma:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

isso deve fazer o que você quer.

Notas de sintaxe:

  • -r - pesquisa recursivamente
  • -i - case - insensitive search
  • --include=\*.${file_extension} - procura arquivos que correspondem à (s) extensão (ões) ou padrão de arquivo apenas
1110
Nelson

Algumas dessas respostas pareciam muito pesadas na sintaxe, ou produziam problemas no meu servidor Debian. Isso funcionou perfeitamente para mim:

PHP Revolução: Como Grep arquivos no Linux, mas apenas certas extensões de arquivo?

Nomeadamente:

grep -r --include=\*.txt 'searchterm' ./

... ou versão insensível a maiúsculas ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: command

  • -r: recursivamente

  • -i: ignore-case

  • --include: todos os arquivos de texto * .txt: (escape com\apenas no caso de você ter um diretório com asteriscos nos nomes dos arquivos)

  • 'searchterm': O que procurar

  • ./: inicia no diretório atual.

234
HoldOffHunger

E se:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
47
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
43
Yuri Malov

Não há opção -r nos servidores HP e Sun, desta forma funcionou para mim no meu servidor HP

find . -name "*.c" | xargs grep -i "my great text"

-i é para busca insensível a maiúsculas e minúsculas

15
Sam B

Como isso é uma questão de finding files, vamos usar find!

Usando GNU você pode usar a opção -regex para encontrar esses arquivos na árvore de diretórios cuja extensão é .h ou .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Então, é apenas uma questão de executar grep em cada um dos seus resultados:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Se você não tem essa distribuição de encontrar você tem que usar uma abordagem como Amir Afghani , usando -o para concatenar opções ( o nome está terminando com .h ou com .cpp):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

E se você realmente quiser usar grep, siga a sintaxe indicada para --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
11
fedorqui

A maneira mais fácil é

find . -type  f -name '*.extension' | xargs grep -i string 
7
user3640130

Estou ciente de que esta pergunta é um pouco datada, mas gostaria de compartilhar o método que eu normalmente uso para encontrar .c.h arquivos:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

ou se você precisar do número da linha também:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
3
Tom

Abaixo resposta é boa.

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

Mas pode ser atualizado para:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

O que pode ser mais simples.

2
hao

ag (o pesquisador de prata) tem uma sintaxe bastante simples para isso

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

assim

ag -G *.h -G *.cpp CP_Image <path>
2
Eldamir

Deve escrever "-exec grep" para cada "-o -name"

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

Ou agrupe-os por ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

opção '-Hn' mostra o nome e a linha do arquivo.

1
where23