我想找到包含特定文本字符串的所有文件。 该 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.
我相信你可以使用这样的东西:
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:
这行命令使用 find 和 grep 修复问题:
$ 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 (GNU 或 BSD)
您可以使用 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/

