Я пытался рекурсивно искать шаблон во всех файлах .c следующим образом
> grep -lr search-pattern *.c
Но получил это в качестве выходного сигнала
> grep: *.c: No such file or directory
Когда я использую это: [ 115]
> grep -lr search-pattern *
Я получаю много. c файлы в каталогах с шаблоном.
Что не так с более ранним выражением?
Я предлагаю использовать опцию --include
из grep
:
grep -lr --include='*.c' search-pattern .
*.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.)
Я знаю, что это - довольно старый поток, но так как у меня был тот же вопрос, я хочу совместно использовать свой предпочтительный способ достигнуть того же В намного более короткой форме.
ls | grep "file.*.c"
Как указано в документации 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