我想找到包含特定文本字符串的所有文件。 该 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/