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

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

这将是更好地使用

grep -rl "string" /path

哪里

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

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

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

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

我发现非常有用的其他选项:

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

    grep -Hrn search . | less -r
  • --exclude-dir=dir 有用的排除目录,如 .svn.git.

Example output

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

find /path -type f -exec grep -l "string" {} \;

评论的解释

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

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

我的默认命令是

grep -Rin string *

我使用国会大厦'R',因为 ls 使用它进行递归。 由于grep接受两者,没有理由不使用它。

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

如果你愿意尝试新的东西,给 ack 一枪。 递归搜索当前目录的命令 string 是:

ack string

安装相当简单:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(前提是你已经有了目录 ~/bin 最好是在你的 PATH.)

命令rgrep专用于这种需要

如果不可用,你可以这样得到它

mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep

您可以直接设置为您的默认grep选项,如上所述。

我个人使用

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"

相关主题 : 如何始终使用rgrep与颜色

更新2:

这行命令使用 findgrep 修复问题:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> 用于彩色输出:

$ find path_to_search_in -type f \            -exec grep --color=always -in searchString {} 2>/dev/null +

例子::

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

在下面的快照中运行的示例:


更新1:

您可以尝试以下代码;作为您的 .bashrc.bash_aliases 或者在脚本中:

wherein () {     for i in $(find "$1" -type f 2> /dev/null);    do        if grep --color=auto -i "$2" "$i" 2> /dev/null; then            echo -e "\033[0;32mFound in: $i \033[0m\n";        fi;    done}

使用方法: wherein /path/to/search/in/ searchkeyword

例子::

$ wherein ~/Documents/ "hello world"

(注意:正如@enzotib在下面的评论中所建议的那样,这不适用于文件/目录,其中包括名称中的空格。)


原帖

搜索字符串并输出与搜索字符串相同的行:

$ for i in $(find /path/of/target/directory -type f); do \    grep -i "the string to look for" "$i"; done

例如:

$ for i in $(find /usr/share/applications -type f); \    do grep -i "web browser" "$i"; done

显示包含搜索字符串的文件名:

$ for i in $(find /path/of/target/directory -type f); do \    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

例如:

$ for i in $(find /usr/share/applications -type f); \    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \    fi; done;

grep (GNUBSD)

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

grep -r "pattern" .

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

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

grep "class foo" **/*.c

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

如果你的论点太长了,可以考虑缩小搜索范围,或者使用 find 语法,而不是如:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

或者使用 ripgrep.

ripgrep

如果你正在处理更大的项目或大文件,你应该使用 ripgrep 相反,像:

rg "pattern" .

签出文档、安装步骤或源代码 GitHub项目页面.

它比任何其他工具都快得多 GNU/BSD grep, ucg, ag, sift, ack, pt 或类似的,因为它是建立在顶部 Rust的正则表达式引擎 它使用有限自动机,SIMD和积极的文字优化,使搜索非常快。

它支持在 .gitignore 文件,因此单个文件路径可以同时与多个glob模式匹配。


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

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

我使用xargs执行此操作,这是一个非常被低估的命令

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

找到。/给你一个当前文件夹中所有文件的递归列表,然后你把它传送到对每个文件执行grep命令的xargs

我知道这里有很多答案,但如果您想在搜索文件时添加其他限制,这里有一个替代方案:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

这是因为 grep 如果找到结果,将返回0,否则返回1。 例如,您可以找到1MB大的文件 包含一些东西:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

对于多个需求,您可能希望使用优化器标志 -O 这存在于GNU grep中。

带有`–include="*的通配符。C"'选项,@user311346,感谢@Lekensteyn。

grep-RIn将在所有文本文件中从当前目录向下搜索。
不知道如何在像
这样的文件模式中递归地进行搜索。只有grep的C

使用find和grep组合递归搜索当前和所有子目录中的字符串文件。 检查一下http://wilddiary.com/find-files-containing-my-text/