Grep recursivo falha para arquivos * .c

13

Tentei pesquisar recursivamente um padrão em todos os arquivos .c da seguinte maneira

> grep -lr search-pattern *.c

Mas entendi isso como a saída

> grep: *.c: No such file or directory

Quando eu uso isso:

> grep -lr search-pattern *

Eu recebo bastante. arquivos c nos diretórios com o padrão.

O que há de errado com a expressão anterior?

Jay
fonte

Respostas:

22

Sugiro usar a --includeopção de grep:

grep -lr --include='*.c' search-pattern .
enzotib
fonte
1
+1. Eu não conhecia a --include=GLOBopção. Em combinação com a opção recursiva, isso é muito poderoso e não requer find. Agradável!
214132 Gertvdijk
Cheguei atrasado à festa aqui, mas estou confuso sobre para que .serve o final do comando.
Nathan Jones
1
@NathanJones: grep requer um ou mais nomes de arquivos ou diretórios nos quais pesquisar. O ponto diz: procurar no diretório atual
enzotib
3

O *.cpadrão é avaliado pelo seu shell. Isso se aplica ao diretório atual, como você usaria ls *.c.

Acho que o que você deseja é encontrar todos os arquivos correspondentes ao *.cpadrão (recursivamente) e grepprocurar por você nele. Aqui está uma maneira de fazer isso:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Ele usa xargspara acrescentar os resultados da pesquisa por find.


Como alternativa, use a -execopção para encontrar, por exemplo:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

Além disso, não tenho certeza se você realmente deseja a -lopção grep. Parará na primeira partida:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)
gertvdijk
fonte
A find/xargssintaxe é interrompida nos nomes de arquivos que contêm espaços. A -Lopção de grepparar na primeira correspondência de cada arquivo e continuar com o próximo arquivo: se alguém quiser apenas ver se o padrão está contido pelo menos uma vez em cada arquivo, é mais rápido.
enzotib
@enzotib Obrigado, corrigi-lo usando a -print0opção e xargs --null.
214131 # gustavijk
-1

Sei que esse é um tópico bastante antigo, mas, como tive a mesma pergunta, quero compartilhar minha maneira preferida de obter o mesmo, de uma forma muito mais curta.

ls | grep "file.*.c"
Jebiel
fonte
2
A pergunta é sobre procurar um padrão, não sobre procurar um arquivo.
Jay