如何使用grep在文件夹中查找单词?


542

在Windows中,我会进行搜索以在文件夹内找到单词。同样,我想知道在包含许多子目录和文件的目录中是否出现特定单词。我对grep语法的搜索显示我必须指定文件名,即grep string filename

现在,我不知道文件名,该怎么办?一位朋友建议这样做grep -nr string,但是我不知道这意味着什么,我也没有得到任何结果(在发出之前,没有任何回应ctrl + c)。

Answers:


847
grep -nr 'yourString*' .

末尾的点搜索当前目录。每个参数的含义:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (将查找MobileAppServlet.javaor MobileAppServlet.classMobileAppServlet.txt; 'MobileAppASer*.*'是另一种执行相同操作的方法。)

要检查更多参数,请使用man grep命令。


14
有什么关系*?这将导致外壳通配符扩展(如果存在与通配符模式匹配的文件名),或者grep将其用作0或更多的上述字符的重复运算符*
usta 2013年

7
现在让我们考虑两种可能性为grep -nr MobileAppSer* .1。假设我们在当前目录中匹配3个文件MobileAppSer*通配符模式:命名MobileAppServlet.javaMobileAppServlet.classMobileAppServlet.txt。然后grep将被调用是这样的:grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .。这意味着在文件MobileAppServlet.java,MobileAppServlet.txt和当前目录的其他位置中搜索文本“ MobileAppServlet.class”-这肯定不是用户想要的。
usta 2013年

7
2.如果当前目录中没有与MobileAppSer*通配符模式匹配的文件,grep将按MobileAppSer*原样接收参数,因此将其作为搜索文本“ MobileAppSe”后跟0个或多个出现的“ r”的原因,因此它将尝试在当前目录的文件内容中查找文本“ MobileAppSe”,“ MobileAppSer”,“ MobileAppSerr”,“ MobileAppSerrr”等,而不是用户想要的。
usta 2013年

5
这是一个正则表达式的可疑选择。乌斯塔指出了这一点。
kindasimple 2014年

117
grep -nr string my_directory

附加说明:这满足语法要求,grep [options] string filename因为在类Unix系统中,目录是一种文件(存在一个“常规文件”一词,专门用于指代Windows中仅称为“文件”的实体)。

grep -nr string 从标准输入中读取要搜索的内容,这就是为什么它只是在那里等待您的输入,并在按^ C时停止这样做(它也将在^ D处停止,这是结束输入的组合键) -文件)。


1
嘿,因此,无论大小写如何,我都想这样做:grep -i -nr“ my word”。
kiki 2010年

2
@kiki:是的,相当于grep -inr "my word" .
usta 2010年

16
@kiki:-r对于grep而言,意味着递归地在子目录中搜索,并且-n意味着在输出的每一行前都添加包含该行的文件的相应行号。man grep描述所有这些,还有更多。
usta 2010年

62

GREP:全局正则表达式打印/解析器/处理器/程序。
您可以使用它来搜索当前目录。
您可以为-recursive指定-R,这意味着程序将在所有子文件夹,它们的子文件夹以及它们的子文件夹的子文件夹中进行搜索。

grep -R "your word" .

-n将在文件中匹配的位置打印行号。
-i将搜索不区分大小写的字母(大写/非大写字母)。

grep -inR "your regex pattern" .

3
./*表示当前目录中的所有文件,-R表示递归(搜索子目录等)
Stefan Steiger 2010年

25
grep -nr search_string search_dir

将执行RECURSIVE(意味着目录及其所有子目录)搜索search_string。(由usta正确回答)。

您没有得到朋友建议的麻烦:

grep -nr string

是因为未指定目录。如果您要在其中进行搜索的目录,则必须执行以下操作:

grep -nr string .

包含“。”很重要 字符,因为这告诉grep搜索此目录。


嗨,如果我必须搜索两个单词之间有一个空格,该怎么办?是否应在引号中指定单词?即grep -nr“我的话”。
kiki 2010年

24

还有:

find directory_name -type f -print0 | xargs -0 grep -li word

但这对于初学者来说可能有点过多。

find是通用目录walker / lister,-type f表示“查找普通文件,而不是目录和命名管道以及所拥有的内容”,-print0表示“使用空字符作为分隔符将它们打印在标准输出上”。使用空字符作为记录分隔符(而不是标准换行符),将来自的输出find发送到xargs -0并抓取其标准输入(成块(以避免命令行长度限制)),并将其应用于grep -li word每个文件集。在上grep-l表示“列出匹配的文件”,-i表示“不区分大小写”;您通常可以结合使用单个字符选项,因此-li比看到更多-l -i

如果不使用-print0-0则会遇到包含空格的文件名的问题,因此使用它们是一个好习惯。


1
@mmmshuddup:谢谢。如果我不作解释作为回答的一部分,我会感到很不好,尤其是在与初学者一起工作时。
亩太短了

1
这就是我在此站点上最欣赏的内容。重要的是要记住,我们都是初学者,要进入技术世界并不容易!
是Barry

我可以排除某些目录吗?@muistooshort
Ferologics

@Ferologics应该存在,man find从命令行检查以查看您find支持的选项。
亩太短了

8

为什么不进行递归搜索以在子目录中找到所有实例:

grep -r 'text' *

这就像一个魅力。


1
无需引用没有特殊字符(例如空格)的搜索字符串
Scott Stensland 2015年

5
  1. grep -r "yourstring" * 将在任何文件和文件夹中找到“您的字符串”

现在,如果您想同时查找两个不同的字符串,则可以始终使用选项E并为搜索添加单词。休息后的例子

  1. grep -rE "yourstring|yourotherstring|$" *将搜索列表位置yourstringyourotherstring匹配的位置

4

我喜欢使用的另一个选项:

find folder_name -type f -exec grep your_text  {} \;

-type f仅返回文件,不返回文件夹

-exec和{}在搜索中找到的文件上运行grep(确切的语法是“ -exec命令{}”)。



2

您选择的答案很好,并且可行,但这不是正确的答案,因为:

grep -nr yourString* .

实际上,这会搜索字符串"yourStrin""g"0或多次。

因此,正确的方法是:

grep -nr \w*yourString\w* .

此命令在当前文件夹中搜索带有前后任何字符的字符串。


2
但是grep -nr yourString,它也可以工作,因为它会寻找yourString行中任何地方的裸机(或者至少在我的系统OSX Lion上如此)
theheadofabroom 2013年


1

在目录中运行(终端)以下命令。它也会递归地检查子目录内部。

grep -r 'your string goes here' * 

0

以下示例递归查找文件夹中和处your search string*.xml*.js文件。path1path2path3

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

因此,您可以在文件的子集中搜索许多目录,只需在末尾提供路径即可。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.