* .c文件的递归grep失败


13

我尝试通过以下方式在所有.c文件中递归搜索模式

> grep -lr search-pattern *.c

但是得到这个作为输出

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

当我使用这个:

> grep -lr search-pattern *

我得到很多。具有模式的目录中的c文件。

较早的表达式有什么问题?

Answers:


22

我建议使用以下--include选项grep

grep -lr --include='*.c' search-pattern .

1
+1。我不知道该--include=GLOB选项。结合使用递归选项,此功能非常强大,不需要find。真好!
gertvdijk

在这里参加聚会很晚,但是我.对命令末尾的目的感到困惑。
内森·琼斯

1
@NathanJones:grep需要一个或多个要在其中搜索的文件名或目录。点表示:在当前目录中搜索
enzotib 2014年

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谢谢,使用-print0option和修复了它xargs --null
gertvdijk

-1

我知道这是一个比较老的话题,但是由于我有同样的问题,我想以更短的形式分享实现相同目标的首选方式。

ls | grep "file.*.c"

2
问题是关于搜索模式,而不是搜索文件。
杰(Jay)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.