如何使用“grep”命令查找包含子目录的文本

Smi*_*ter 441 command-line grep

我想查找包含特定文本字符串的所有文件。该grep命令有效,但我不知道如何对每个目录使用它(我只能对当前目录执行此操作)。我尝试阅读man grep,但没有产生任何帮助。

enz*_*tib 598

最好使用

grep -rl "string" /path
Run Code Online (Sandbox Code Playgroud)

在哪里

  • -r(或--recursive) 选项也用于遍历 的所有子目录/path,而
  • -l(或--files-with-matches) 选项仅用于打印匹配文件的文件名,而不是匹配的行(这也可以提高速度,因为grep在第一次与此选项匹配时停止读取文件)。

  • 实际上,如果“字符串”是要查找的文本模式,最好使用该功能,否则当字符串包含点或在正则表达式中有意义的特殊字符而不仅仅是应该作为字符串找到的点时,有人可能会遇到问题,原样。然后我会使用 `-rlF` 开关,`-F` 用于“固定字符串”(而不是正则表达式 - 例如)。当然,如果任务是使用正则表达式,那么请原谅。当然,同样的理论也没有 -r,我经常看到人们假设 grep 搜索“文本”,它可能会导致问题,其中特殊的问题意味着正则表达式。 (13认同)
  • 还有一个忽略大小写的 `-i` 标志。 (4认同)
  • 我只想展示 `--recursive` 选项,有很多选项和使用场景可以讨论。我从@dmityugov 接受的答案开始,并修改为无需“查找”即可工作。 (3认同)
  • @ScottBiggs:使用选项`--include '*.h'` (3认同)

Lek*_*eyn 197

如果您正在寻找文件中匹配的行,我最喜欢的命令是:

grep -Hrn 'search term' path/to/files
Run Code Online (Sandbox Code Playgroud)
  • -H 导致打印文件名(搜索多个文件时隐含)
  • -r 进行递归搜索
  • -n 导致打印行号

path/to/files可以是.在当前目录中搜索

我认为非常有用的其他选项:

  • -I忽略二进制文件(补充:-a将所有文件视为文本)
  • -F治疗search term为文字,而不是一个正则表达式
  • -i 进行不区分大小写的搜索
  • --color=always即使在管道通过时也能强制使用颜色less。要制作less支持颜色,您需要使用该-r选项:

    grep -Hrn search . | less -r
    
    Run Code Online (Sandbox Code Playgroud)
  • --exclude-dir=dir用于排除像.svn和这样的目录.git

示例输出

  • 文件夹上的`-H` 是多余的,如果有多个文件,很可能。事实上,手册页说`-H, --with-filename: 打印每个匹配项的文件名。这是要搜索多个文件时的默认设置。` (13认同)
  • @user2413 尝试`--include '*.*'` (6认同)

小智 26

我相信你可以使用这样的东西:

find /path -type f -exec grep -l "string" {} \;
Run Code Online (Sandbox Code Playgroud)

来自评论的解释

find是一个命令,可让您在给定路径的子目录中查找文件和其他对象,如目录和链接。如果您没有指定文件名应满足的掩码,它将枚举所有目录对象。

  • -type f 指定它应该只处理文件,而不是目录等。
  • -exec grep指定对于每个找到的文件,它应该运行 grep 命令,将其文件名作为参数传递给它,通过替换{}为文件名

  • 只是对于那些不知道的人,添加`-name '*.py'` 将匹配限制为以 '.py' 结尾的文件。 (3认同)
  • @DanielF 现在是 ```--include='*.py'``` 而不是 ```-name '*.py'``` (2认同)

use*_*723 23

我的默认命令是

grep -Rin string *
Run Code Online (Sandbox Code Playgroud)

我使用大写字母“R”,因为ls它用于递归。由于 grep 接受两者,没有理由不使用它。

编辑:根据 HVNSweeting,显然-R将遵循符号链接,而-r不会。


Kon*_*lph 13

如果您愿意尝试新事物,请试一试ack。递归搜索当前目录的命令string是:

ack string
Run Code Online (Sandbox Code Playgroud)

安装非常简单:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
Run Code Online (Sandbox Code Playgroud)

(前提是您已经获得了目录~/bin,并且最好在您的PATH.)

  • 或者只是 apt-get install ack-grep (,并将别名 ack=ack-grep 添加到您的 .bashrc) (2认同)

ken*_*orb 6

grepGNUBSD

您可以使用grep工具通过参数递归搜索当前文件夹-r,例如:

grep -r "pattern" .
Run Code Online (Sandbox Code Playgroud)

注意:-r- 递归搜索子目录。

要在特定文件中搜索,您可以使用通配语法,例如:

grep "class foo" **/*.c
Run Code Online (Sandbox Code Playgroud)

注意:通过使用通配选项( **),它会递归扫描具有特定扩展名或模式的所有文件。要启用此语法,请运行:shopt -s globstar您还可以使用**/*.*所有文件(不包括隐藏文件和无扩展名文件)或任何其他模式。

如果您遇到参数太长的错误,请考虑缩小搜索范围,或使用find如下语法:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Run Code Online (Sandbox Code Playgroud)

或者使用ripgrep.

ripgrep

如果您正在处理较大的项目或大文件,则应该使用ripgrep,例如:

rg "pattern" .
Run Code Online (Sandbox Code Playgroud)

在GitHub 项目页面上查看文档、安装步骤或源代码

它比GNU / BSD grepucgagsiftack、或类似工具快得多,因为它构建在Rust 的正则表达式引擎pt之上,该引擎使用有限自动机、SIMD 和积极的文字优化来使搜索速度非常快。

它支持忽略文件中指定的模式.gitignore,因此单个文件路径可以同时与多个 glob 模式匹配。


您可以使用常用参数,例如:

  • -i- 不敏感的搜索。
  • -I- 忽略二进制文件。
  • -w- 搜索整个单词(与部分单词匹配相反)。
  • -n- 显示您的比赛路线。
  • -C/ --context(例如-C5)- 增加上下文,以便您看到周围的代码。
  • --color=auto- 标记匹配的文本。
  • -H- 显示找到文本的文件名。
  • -c- 显示匹配行的计数。可以与 结合使用-H