Estou trabalhando para escrever alguns scripts em grep
determinados diretórios, mas esses diretórios contêm todos os tipos de tipos de arquivos.
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?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP [email protected]
. Tarefa concluída.-r
paragrep
tê-lo procurar arquivos como que quebra o mantra UNIX de ter ferramentas que "fazer uma coisa e fazê-lo bem". Existe uma ferramenta perfeitamente boa para encontrar arquivos com um nome MUITO óbvio.Respostas:
Basta usar o
--include
parâmetro, assim:isso deve fazer o que você quer.
Para tirar a explicação da resposta do HoldOffHunger abaixo:
grep
: comando-r
: recursivamente-i
: ignorar caso--include \*.cpp
: all * .cpp: arquivos C ++ (escape com \ apenas no caso de você ter um diretório com asteriscos nos nomes dos arquivos)./
: Inicia no diretório atual.fonte
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
Algumas dessas respostas pareciam muito sintáticas ou produziam problemas no meu servidor Debian. Isso funcionou perfeitamente para mim:
Revolução do PHP: Como Grep arquivos no Linux, mas apenas determinadas extensões de arquivo?
Nomeadamente:
... ou versão sem distinção entre maiúsculas e minúsculas ...
grep
: comando-r
: recursivamente-i
: ignorar caso--include
: all * .txt: arquivos de texto (escape com \ apenas no caso de você ter um diretório com asteriscos nos nomes dos arquivos)'searchterm'
: O que pesquisar./
: Inicia no diretório atual.fonte
*
uso\*.cpp
ou'*.cpp'
. Caso contrário, ele não fornecerá o resultado esperado quando o diretório de trabalho contiver alguns*.txt
arquivos.--include=<pattern>
mas é importante escapar*
com--include <pattern>
(um espaço em vez de=
) que parece muito semelhante caso contrário.fonte
--include
opção após agulha e não com outras opções?--
?E se:
fonte
-name
argumentos. coisas estranhas podem acontecer se você não.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
possível agrupar argumentos opcionalmente, reduzindo ao mínimo as invocações do processo chamado.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Isso é sugerido, mas não destacado na resposta do @ fedorqui abaixo e é uma melhoria que vale a pena. O-H
argumento para grep aqui é útil quando localizar apenas identifica um único arquivo correspondente. Isso poderia eliminar o uso de-print
na resposta. Se sua lista total de arquivos for suficientemente pequena,{path1,path2}/**/*.{cpp,h}
pode ser preferível usar um globo recursivo do shell (por exemplo ).Não há opção -r nos servidores HP e Sun, dessa maneira funcionou para mim no meu servidor HP
-i é para pesquisa sem distinção entre maiúsculas e minúsculas
fonte
ll
mas não adiciona--color=auto
ao grep.Como se trata de encontrar arquivos, vamos usar
find
!Usando o GNU find, você pode usar a
-regex
opção para encontrar esses arquivos na árvore de diretórios cuja extensão é.h
ou.cpp
:Então, é apenas uma questão de executar
grep
em cada um de seus resultados:Se você não tiver essa distribuição de localização, precisará usar uma abordagem como a de Amir Afghani , usando
-o
para concatenar opções ( o nome está terminando com.h
ou com.cpp
):E se você realmente deseja usar
grep
, siga a sintaxe indicada para--include
:fonte
A maneira mais fácil é
fonte
ag
(o pesquisador prateado) possui uma sintaxe bastante simples para essetão
fonte
ag _string_to_find_ -G _filename_regex_
A resposta abaixo é boa:
Mas pode ser atualizado para:
O que pode ser mais simples.
fonte
Deve escrever "-exec grep" para cada "-o -name"
Ou agrupe-os por ()
a opção '-Hn' mostra o nome e a linha do arquivo.
fonte
Estou ciente de que esta questão é um pouco antiga, mas gostaria de compartilhar o método que normalmente uso para encontrar arquivos .c e .h :
ou se você também precisar do número da linha:
fonte