Como usar o grep recursivamente em certas extensões de arquivo

0
16


grep é uma ótima ferramenta para pesquisar arquivos e entradas padrão no Linux e é capaz de correspondência de padrões de string e Regex. No entanto, às vezes é necessário controlar que tipo de arquivos grep buscas e tem sinalizadores embutidos para fazer exatamente isso.

Incluir apenas alguns arquivos em pesquisas grep

Por padrão, grep irá procurar todos os arquivos em uma determinada pasta e suas subpastas se você chamá-la com o recursivo -r bandeira. Isso vai pegar tudo, mas se você quiser apenas algumas extensões, a opção que você vai querer usar é --include.

a --include bandeira diz grep uma inclui apenas arquivos que correspondem a um determinado padrão. Se especificado, grep tratará todos os sinalizadores de inclusão como uma lista de permissões. Você pode usar isso com qualquer caractere global do Linux, como curingas para corresponder a tudo, incluindo uma determinada extensão:

grep -inr --include *.txt "foo" ~/folder

Observe que isso é escapado com uma barra porque es posible que los nombres de archivos tengan asteriscos. También puede especificar varios --include sinalizadores, por exemplo, pesquisando todos os arquivos de origem HTML, JS e CSS em um wwwroot:

grep -inr --include *.html --include *.css --include *.js "foo" ~/folder

Da mesma forma, você também pode excluir certos nomes de arquivos, que ainda corresponderão a tudo, exceto o glob, atuando como uma lista negra em cima da configuração existente:

grep -inr --exclude *.txt "foo" ~/folder

Há também um sinalizador para excluir diretórios inteiros de uma só vez:

grep -inr --exclude-dir config "foo" ~/folder

Use localizar em vez disso

Alternativamente, se você preferir usar o find utilitário para pesquisar arquivos, você pode conectá-lo a grep Usando tubos e xargs. find ele pode realizar pesquisas de padrões e Regex e tem vários benefícios, incluindo a capacidade de filtrar facilmente arquivos com base em metadados, como tamanho, data de criação e modificação e outros identificadores do Linux.

O comando é um pouco obtuso, pois você precisará usar -print0 no final de find para imprimir uma lista de uma única linha e depois passá-la para xargs -0 S grep desde ali.

 find ./ -type f -iname "*.txt" -print0 | xargs -0 grep "foo"