如何对目录中的所有文件执行grep操作

use*_*075 185 linux shell grep

使用xenserver,我想对目录中的每个文件执行命令,从命令输出中删除一些东西并将其附加到文件中.

我清楚我想要使用的命令以及如何根据需要grep out string.

但是我不清楚的是我如何让它在每个文件上执行此命令,转到下一个文件,直到找不到更多文件.

umi*_*umi 203

grep $PATTERN *就足够了.默认情况下,grep会跳过所有子目录.但是,如果你想通过它们,那grep -r $PATTERN *就是这种情况.

  • "grep -r $ PATTERN." 足够了.对于递归grep,您不需要指定所有文件 (32认同)
  • @Tomáš Zato,只需提供所有文件模式而不是 *:`grep $PATTERN *.cpp *.h`。如果您需要更具体的规则来确定应该搜索哪些文件,请使用 `find` 命令(查看 Rob 的回答)。 (2认同)
  • @Chris 可能您当前目录中没有 `*.scss` 文件,而是子目录中更深的某个地方,因此 grep 不会查看您想要的所有文件。您应该使用 `--include` 选项来告诉 grep 递归查找匹配特定模式的文件:`grep -rx --include '*.scss' 。`(注意引号,它们防止模式被 shell 扩展)。或者只是使用`find`(参见Rob的回答)。 (2认同)

Nar*_*ain 135

在Linux中,我通常使用此命令以递归方式grep dir中的特定文本

grep -rni "string" *
Run Code Online (Sandbox Code Playgroud)

哪里,

r = recursive即,搜索当前目录中的子目录
n =将行号打印到stdout
i =不区分大小写的搜索


Rob*_*Rob 28

使用find.说真的,这是最好的方法,因为那时你可以真正看到它正在运行的文件:

find . -name "*.sql" -exec grep -H "slow" {} \;
Run Code Online (Sandbox Code Playgroud)

注意,-H是特定于mac的,它在结果中显示文件名.

  • 如果您决定使用find,通过`xargs`而不是使用`-exec`来管道输出,这将**更快,因为`-exec`为每个grep生成一个新进程,并且开销变得很大文件数量.有关文件名中空格的标准警告适用于`xargs`. (6认同)
  • 现代“find”上的“-exec”支持像“xargs”一样的快捷方式,并且实际上会更快(因为您删除了“xargs”)。使用 `-exec ... {} +` 代替 `-exec ... {} \;` (3认同)
  • 这看起来到底是什么样的?我总是忘记`xargs`语法. (2认同)
  • @BrianPeterson会是这样的:`find。-iname“ * .sql” -print0 | xargs -0 grep“ slow”` (2认同)

Noa*_*nos 13

要在所有子目录中搜索,但仅在特定文件类型中搜索,请将 grep 与--include.

例如,在当前目录中递归搜索 *.yml 和 *.yaml 中的文本:

grep "text to search" -r . --include=*.{yml,yaml}
Run Code Online (Sandbox Code Playgroud)