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

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

现在,我不知道文件名,所以我该怎么做? 一个朋友建议做grep -nr string,但我不知道这意味着什么,我没有得到任何结果(没有回应,直到我发出Ctrl + C)
1132725 次浏览
grep -nr string my_directory

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

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

grep -nr search_string search_dir

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

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

grep -nr string

是因为没有指定目录。如果你在你想要搜索的目录中,你必须执行以下操作:

grep -nr string .

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

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

grep -R "your word" .

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

grep -inR "your regex pattern" .

还有:

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

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

find是一个通用的目录漫游器/列表,-type f意味着“寻找普通文件而不是目录和命名管道”,-print0意味着“使用空字符作为分隔符将它们打印到标准输出中”。find的输出被发送到xargs -0,并使用空字符作为记录分隔符(而不是标准换行符)以块形式获取其标准输入(以避免命令行长度限制),然后将grep -li word应用于每组文件。在grep上,-l表示“列出匹配的文件”;-i的意思是“不区分大小写”;你通常可以组合单个字符选项,这样你会更经常地看到-li而不是-type f0。

如果你不使用-print0-0,那么你会遇到包含空格的文件名的问题,所以使用它们是一个好习惯。

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

使用grep的男人命令查看更多参数。

你选择的答案是好的,它是可行的,但它不是正确的方法,因为:

grep -nr yourString* .

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

所以正确的做法是:

grep -nr \w*yourString\w* .

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

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

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

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

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

为什么不做一个递归搜索来找到子目录中的所有实例:

grep -r 'text' *

这就像一个咒语。

    <李> # EYZ0 将发现"yourstring"在任何文件和文件夹

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

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

不要使用grep。下载银色的搜索器ripgrep。它们都很出色,并且比grep或ack快得多,有大量的选项。

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

grep -wnr "yourString" .
grep -R "string" /directory/

当-R不跟随符号链接时,-R也跟随符号链接。

在目录中运行(terminal)以下命令。它还将递归地检查子目录内部。

grep -r 'your string goes here' *

下面的示例递归地查找位于path1path2path3文件夹中的*.xml*.js文件中的your search string

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

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