Como posso grep nos arquivos de origem para algum texto?

8

No momento em que estou usando dois comandos, tenho certeza de que deve haver uma maneira melhor ...

wim@wim-acer:~/ffmpeg$ find . -name "*.h" -print0 | xargs -0 grep -i invalid\ preset
wim@wim-acer:~/ffmpeg$ find . -name "*.c" -print0 | xargs -0 grep -i invalid\ preset
wim
fonte
1
faz -name '*.[ch]'o trabalho?
Glenn Jackman

Respostas:

10

O ack (ou, no Debian / Ubuntu, ack-grep) ignorará arquivos que não são de origem, como controle de versão ou binários. Muito útil.

para pesquisar apenas arquivos .c e .h, como acima:

ack-grep -i --cc "invalid preset"

o --cc(o formato mais longo é --type cc) examina apenas os arquivos .c .h e .xs. A lista completa de tipos de arquivos pode ser visualizada com ack-grep --help type. Na maioria das vezes, você não precisará particularmente --typedo arquivo, pois geralmente só tem os arquivos para pesquisar e, em seguida, os arquivos que não verá por padrão, como binários, backups e arquivos de controle de versão.

Alister Bulman
fonte
5

O greppróprio programa pode pesquisar recursivamente e também aceita uma opção para pesquisar apenas determinados arquivos. O seguinte é equivalente aos seus dois findcomandos.

grep -Ri --include=*.[ch] invalid\ preset .
garyjohn
fonte
Isso funcionou para mim quando me livrei dos colchetes
Mike
1

O comando find pode chamar o próprio grep.

find . \( -name "*.c" -o -name "*.h" \) -exec grep -i "invalid preset" {} \; -print

e variações dos mesmos.

Keith
fonte
Mudou para a variação óbvia. ;-)
Keith
0

Posso adicionar algo assim ao seu ~/.bashrc

alias cppgrep='grep -Ri "--include=*.[hc]" "--include=*.cpp" "--include=*.hpp"'
AlejandroVD
fonte