Рекурсивный grep не работает для файлов * .c

13

Я попытался рекурсивно искать шаблон во всех файлах .c следующим образом

> grep -lr search-pattern *.c

Но получил это в качестве выхода

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

Когда я использую это:

> grep -lr search-pattern *

Я получаю много. c файлами в каталогах с шаблоном.

Что не так с более ранним выражением?

сойка
источник

Ответы:

22

Я предлагаю использовать --includeопцию grep:

grep -lr --include='*.c' search-pattern .
enzotib
источник
1
+1. Я не знал --include=GLOBвариант. В сочетании с рекурсивной опцией это очень мощно и не требует find. Ницца!
gertvdijk
Опоздал на вечеринку, но я не уверен, для чего предназначен .конец команды.
Натан Джонс
1
@NathanJones: grep требуется одно или несколько имен файлов или каталогов для поиска. Точка говорит: поиск в текущем каталоге
enzotib
3

*.cМодель оценивается вашей оболочкой. Это относится к текущему каталогу, так же, как вы используете ls *.c.

Я думаю, что вместо этого вы хотите найти все файлы, соответствующие *.cшаблону (рекурсивно), и grepнайти вас в нем. Вот способ сделать это:

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

Используется xargsдля добавления результатов поиска по find.


В качестве альтернативы используйте -execопцию для поиска, например:

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

Кроме того, я не уверен, если вы действительно хотите -lвариант grep. Это остановится на первом матче:

-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
источник
В find/xargsсинтаксических изломы на именах файлов , содержащих пробелы. -LВариант grepостановки на первом матче каждого файла и продолжить следующий файл: если один только хочет , чтобы увидеть , если шаблон содержится по крайней мере один раз в каждый данный файл, это быстрее.
энзотиб
@enzotib Спасибо, исправил с помощью -print0опции и xargs --null.
gertvdijk
-1

Я знаю, что это довольно старая тема, но так как у меня был тот же вопрос, я хочу поделиться своим предпочтительным способом достижения того же самого, в гораздо более короткой форме.

ls | grep "file.*.c"
Jebiel
источник
2
Вопрос в том, чтобы искать шаблон, а не в файле.
Джей