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

评论

grep -RIn <您的模式> *将在所有文本文件中从当前目录向下搜索。不确定如何仅使用grep
以* .C之类的文件模式进行递归搜索
带有--include =“ *。C”选项的通配符@ user311346,感谢@Lekensteyn。

使用find和grep组合可递归地在文件中搜索当前目录和所有子目录中的字符串。检查此wilddiary.com/find-files- contains-my-text

#1 楼

最好使用

grep -rl "string" /path


其中



-r(或--recursive)选项用于遍历同样是/path的所有子目录,而

-l(或--files-with-matches)选项仅用于打印匹配文件的文件名,而不打印匹配行(鉴于grep停止,这也可以提高速度首先使用此选项读取文件)。


评论


实际上,如果“字符串”是要查找的文本模式,则最好使用该功能,否则当字符串包含点或特殊字符(在正则表达式中具有含义)而不仅仅是应该作为字符串找到的点时,有人可能会遇到问题。 ,原样。然后,我将使用-rlF开关,将-F用作“固定字符串”(而不是regexp-例如)。当然,如果任务是使用正则表达式,请原谅。当然,同样的理论也没有-r,我经常看到人们假设grep搜索“文本”,这会引起一些问题,这些特殊问题意味着正则表达式。

– LGB
2011年8月1日12:19



还有-i标志,它忽略大小写。

– Marco Ceppi♦
2011年8月1日下午13:15

我只想展示--recursive选项,有很多可以谈论的选项和使用场景。我从@dmityugov接受的答案开始,并修改为找不到。

– Enzotib
2011年8月1日在13:42



@ N.N .:完成:-)

– Enzotib
2011年8月8日在16:04

@ScottBiggs:带有--include'* .h'选项

– Enzotib
16年6月18日在21:23

#2 楼

如果要在文件中查找匹配的行,我最喜欢的命令是:
搜索多个文件时)

-H进行递归搜索

-r导致打印行号

-n可以是path/to/files进行搜索当前目录

我觉得非常有用的其他选项:



.忽略二进制文件(补充:-I将所有文件都视为文本)

-a-F视为文字而不是正则表达式

search term进行不区分大小写的搜索

-i即使在通过--color=always进行配管时也强制使用颜色。要使less支持颜色,您需要使用less选项: br />

评论


如果可能的话,一个文件夹上的-H是多余的,如果有一个以上的文件。实际上,手册页上显示-H,--with-filename:打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。

– Enzotib
2011年8月1日在12:31

我不知道,它总是按我预期的那样工作。查找文件时这是我的默认命令。

– Lekensteyn
2011年8月1日12:34

有没有办法只考虑扩展名为.a的文件(并将其与-r结合使用)?

–user2413
2012年11月4日在22:54

@ user2413尝试--include'*。*'

– Lekensteyn
2012年11月5日15:24

@alper尝试grep --exclude ='*〜'...

– Lekensteyn
19-09-21在8:27

#3 楼

我相信您可以使用类似这样的东西:给定路径的子目录中的目录和链接。如果您未指定文件名应满足的掩码,则它会枚举所有目录对象。 />
find指定对于找到的每个文件,应运行grep命令,并将其文件名作为参数传递给该文件,方法是将-type f替换为文件名


评论


仅对于那些不知道的人,添加-name'* .py'会将匹配项限制为以'.py'结尾的文件。

–丹尼尔F
2014年3月23日在1:10



我喜欢这涵盖了在其grep命令中未实现-R的客户端。

–敬畏
2014年8月11日在20:29

如果要打印匹配的行AND文件名,则使exec像这样:... -exec bash -c'grep -r“ mystring” {} && echo {}'\;

–唐·李(Donn Lee)
19年5月6日在23:24

直接使用grep的相对性能是多少?

–乔纳森
19年7月17日在14:10

@Donn Lee认为最好使用-exec bash -c'grep -H“ pattern” $ 1'_ {} \;

–bac0n
20-4-25在21:57

#4 楼

我的默认命令是

grep -Rin string *


我使用国会大厦“ R”,因为ls将其用于递归。由于grep接受两者,因此没有理由不使用它。

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

评论


要也搜索隐藏文件,请运行shopt -s dotglob(记住-s为“ set”)。然后删除文件时要小心。如果启用了dotglob,则rm -r *会删除当前目录中的所有内容,还会删除其上的目录,因为..匹配。要禁用dotglob,请使用shopt -u dotglob(“未设置”)。尽管更改是暂时的,但仅适用于当前shell。

– Lekensteyn
2011年8月1日19:09

我忘记了这一点。有没有一种方法可以将其设置为一行?像shopt -s dotglob和&shopt -y dotglob这样的东西更方便吗?这样我们就不必担心重置它

–user606723
2011年8月1日19:42

另外,使用grep -Rin string可能更容易。在大多数情况下。我只使用*,因为它看起来更自然。

–user606723
2011年8月1日19:44



如果您使用递归grep,则可以从“。”开始。代替 ”*”。无需dotglob。


2011年8月7日在16:32

对此表示赞成,在联机帮助页中没有提及的一件事是R将跟随符号链接,r不

–HVNSweeting
2013年1月25日下午4:06

#5 楼

如果您愿意尝试新的东西,请尝试一下。递归搜索当前目录中的ack的命令是:

ack string


安装非常简单:

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


(假设您已经有了目录string,最好在您的~/bin中。)

评论


或者只是apt-get install ack-grep(然后在您的.bashrc中添加别名ack = ack-grep)

– markijbema
2011年8月1日在20:37

chmod命令的最后一个参数做什么?它们是特定于chmod还是与bash相关(!#:3部分)?

–艾略特·达芬克(Elliott Darfink)
2014年1月21日上午10:06

@ElliottDarfink正在使用Bash的历史记录功能–!是事件指示符。它们非常强大,可以避免重复。 !#:3到目前为止已引用了命令行的第三个标记,即本例中的〜/ bin / ack。

–康拉德·鲁道夫(Konrad Rudolph)
2014年1月21日在16:59



#6 楼

rgrep命令专用于此类需求

如果不可用,您可以这样获得它

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep


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

我个人使用

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


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

评论


rgrep由grep软件包提供,该软件包默认安装在Ubuntu中。

–卡雷尔
15年1月2日,14:16

#7 楼

更新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 "" -type f 2> /dev/null);
    do
        if grep --color=auto -i "" "$i" 2> /dev/null; then
            echo -e "3[0;32mFound in: $i 3[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


eg:

$ 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;


评论


包含空格的文件名失败。没有显示stderr的事实掩盖了失败。

– Enzotib
15年1月13日在9:38

@enzotib感谢您指出这一点..对于指定的功能来说仍然无法解决..不过,我添加了另一种衬里..

–精确
15年1月13日在20:38

现在答案类似于@dmityugov。

– Enzotib
15年1月13日在21:28

是的,但是从这个意义上说,如果您检查它们在使用grep方面的相似之处,则此页面中的大多数答案都非常相似,其次是使用find with grep的子集...但是如果您要接受不同的开关和调整作为不同的答案,可能我的也适合这里..还是您与众不同?最后一次更新符合我在搜索中的要求:文件名带有搜索键的行和行号。也:)以及彩色输出和错误过滤器,以提高可读性。

–精确
2015年1月14日在6:44



#8 楼


grep(GNU或BSD)

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

grep -r "pattern" .


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

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

grep "class foo" **/*.c


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

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


或者使用find。项目或大文件,应改用ripgrep,例如:

rg "pattern" .


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

它比GNU / BSD ripgrepripgrepgrepucgagsift或类似工具之类的任何其他工具都要快得多,因为它建立在Rust的正则表达式引擎之上,该引擎使用有限自动机,SIMD和积极的文字优化来进行搜索非常快。

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



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



pt-不敏感的搜索。

.gitignore-忽略二进制文件。

-i-搜索整个单词(与部分单词匹配相反)。

-I-显示匹配的行。

-w / -n(例如-C)-增加上下文,因此您会看到周围的代码。

--context-标记匹配的文本。

-C5-显示找到文本的文件名。

--color=auto-显示匹配的行数。可以与-H结合使用。


#9 楼

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

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


find ./为您提供当前文件夹中所有文件的递归列表
,然后进行管道传输它到xargs,在每个文件中的每个文件上执行grep命令

评论


不建议使用不带-print0选项的xargs来查找,而不建议给xargs使用-0选项,它将对包含空格的文件名失败。

– Enzotib
2011年8月1日15:45

@enzotib我已经按照您的建议编辑了答案。-请仔细阅读,如果需要编辑和更正,我将很乐意由您重新编辑。谢谢

–αғsнιη
2015年1月13日9:00

@KasiyA:现在可以,删除我的否决票。

– Enzotib
15年1月13日在9:32

#10 楼

我知道这里有很多答案,但是如果您要在搜索文件时添加其他限制,可以使用以下替代方法:

如果找到结果,则为0,否则为1。例如,您可以找到1 MB大的文件,其中包含以下内容:

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


对于多种需求,您可能想要使用GNU grep中存在的优化器标志grep。 />

#11 楼

用于搜索C,CPP代码的脚本(查找代码):

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n ""


使用:

find-in-code "search string"


#12 楼

grep有一个非常快速的替代方法,称为Platinum Searcher。您可以在这里下载。