639

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

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

4

14 回答 14

1019
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.javaorMobileAppServlet.classMobileAppServlet.txt;'MobileAppASer*.*'是做同样事情的另一种方式。)

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

于 2012-12-17T04:58:37.840 回答
142
grep -nr string my_directory

附加说明:这符合语法grep [options] string filename,因为在类 Unix 系统中,目录是一种文件(有一个术语“常规文件”专门指在 Windows 中称为“文件”的实体)。

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

于 2010-11-08T06:54:23.147 回答
72

GREP:全局正则表达式打印/解析器/处理器/程序。
您可以使用它来搜索当前目录。
您可以指定 -R 为“递归”,这意味着程序搜索所有子文件夹及其子文件夹及其子文件夹的子文件夹等。

grep -R "your word" .

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

grep -inR "your regex pattern" .
于 2010-11-08T07:14:29.213 回答
34

还有:

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那么你会遇到文件名包含空格的问题,所以使用它们是一个好习惯。

于 2010-11-08T07:40:26.380 回答
25
grep -nr search_string search_dir

将对 search_string 进行 RECURSIVE(表示目录及其所有子目录)搜索。(正如usta正确回答的那样)。

您朋友的建议没有得到任何答复的原因是:

grep -nr string

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

grep -nr string .

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

于 2010-11-08T06:59:08.100 回答
11

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

grep -r 'text' *

这就像一个魅力。

于 2013-08-06T22:02:22.190 回答
5

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

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

-type f 只返回文件而不是文件夹

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

于 2013-06-03T14:46:11.770 回答
5
  1. grep -r "yourstring" * 将在任何文件和文件夹中找到“yourstring”

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

  1. grep -rE "yourstring|yourotherstring|$" *yourstring将搜索或yourotherstring匹配的列表位置
于 2015-11-25T14:54:05.963 回答
5

与@eLRuLL 发布的答案类似,指定尊重单词边界的搜索的更简单方法是使用以下-w选项:

grep -wnr "yourString" .
于 2017-12-21T17:22:52.537 回答
4

您选择的答案很好,并且有效,但这不是正确的方法,因为:

grep -nr yourString* .

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

所以正确的做法是:

grep -nr \w*yourString\w* .

此命令在当前文件夹中搜索包含前后任意字符的字符串。

于 2013-05-09T22:13:12.773 回答
4
grep -R "string" /directory/

当 -r 没有时, -R 也遵循符号链接。

于 2019-01-30T13:47:20.480 回答
2

以下示例递归地查找文件夹中某处your search string*.xml*.js文件path1path2以及path3.

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

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

于 2020-05-04T12:35:34.560 回答
1

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

grep -r 'your string goes here' * 
于 2020-01-08T05:15:38.447 回答
-3

不要使用 grep。下载Silver Searcherripgrep。它们都很出色,而且比 grep 或 ack 更快,有很多选项。

于 2017-07-25T02:08:20.390 回答