Проблема рекурсивної помилки для файлів * .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 .

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.)

У find/xargsсинтаксичних злами на іменах файлів , що містять пробіли. -LВаріант grepзупинки на першому матчі кожного файлу і продовжити наступний файл: якщо один тільки хоче , щоб побачити , якщо шаблон міститься принаймні один раз в кожен даний файл, це швидше.
enzotib

@enzotib Спасибі, виправили це за допомогою -print0опції та xargs --null.
gertvdijk

-1

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

ls | grep "file.*.c"

2
Питання полягає у пошуку шаблону, а не в пошуку файлу.
Джей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.