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

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

> grep -lr search-pattern *.c

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

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

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

> grep -lr search-pattern *

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

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

11
задан 14 July 2013 в 18:03

4 ответа

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

grep -lr --include='*.c' search-pattern .
0
ответ дан 14 July 2013 в 18:03

*.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.)
3
ответ дан 14 July 2013 в 18:03

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

ls | grep "file.*.c"
-1
ответ дан 11 October 2019 в 10:42

Как указано в документации grep при обсуждении параметра -r:

"If no folder name is given, grep command will search the string inside the current working directory."

поэтому исходная командная строка (игнорируя флаг -l):

grep -lr search-pattern *.c

рекурсивно ищет в файлах в текущем каталоге, имена файлов которых заканчиваются на .c, «шаблон поиска». Он ничего не найдет, если в текущем каталоге таких файлов нет.

Ваша вторая командная строка (снова игнорируя флаг -l):

 > grep -lr search-pattern *

рекурсивно ищет "шаблон поиска" во всех файлах в текущем каталоге и во всех подкаталогах (поскольку * интерпретируется как подстановочный знак для " имя папки").

Обе ваши командные строки будут «рекурсивно искать шаблон во всех файлах .c», первая в текущем каталоге, вторая путем рекурсивного спуска текущего каталога и всех подкаталогов, если вы удалите «-l» флаг с обоих.

Последующее обсуждение предполагает, что вы намерены просто просмотреть файлы .c в текущем каталоге для поиска (как следует из вашей первой командной строки).

Обсуждение:

Я бы предпочел оставить задачу поиска и перечисления интересующих файлов ls утилите, созданной для этой цели, которая перечисляет их по одному имени файла в строке. Затем я бы построил командную строку для grep с xargs (утилита, созданная для этой цели) из вывода ls и шаблона, который вы хотите grep для поиска (таким образом, используя grep самым естественным образом). Результирующая команда выглядит следующим образом:

ls -1 *.c | xargs grep "C.*t"

Тестовый пример:

В каталоге со следующим содержимым:

Erlang hello.cs hello.exe somefile.c someotherfile.c

следовать вашему описанию намерения , я ожидаю, что моя командная строка найдет файлы somefile.c и someotherfile.c и выполнит поиск в них шаблона, который начинается с заглавной C и заканчивается строчной буквой t.

Файл somefile.c состоит из:

Ignore this!
Content
... this too ...
... and this.

Файл someotherfile.c состоит из

Content to find
Ingore this

и наша команда

ls -1 *.c | xargs grep "C.*t"

выдает следующий результат:

somefile.c:Content
someotherfile.c:Content to find

предоставление аргумента -v команде grep дает обратный результат, т.е. команда:

ls -1 *.c | xargs grep -v "C.*t"

дает результат:

somefile.c:Ignore this!
somefile.c:... this too ...
somefile.c:... and this.
someotherfile.c:Ingore this
0
ответ дан 17 October 2020 в 01:11

Другие вопросы по тегам:

Похожие вопросы: