ChatGPT解决这个技术问题 Extra ChatGPT

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

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

现在,我不知道文件名,那我该怎么办?一个朋友建议做grep -nr string,但我不知道这是什么意思,我没有得到任何结果(直到我发出 Ctrl + C)。


S
Seldom 'Where's Monica' Needy
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*.*' 是做同样事情的另一种方式。)

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


* 有什么关系?它要么导致 shell 通配符扩展(如果有与通配符模式匹配的文件名),要么 grep 将其作为 * 之前字符的 0 个或多个重复运算符。
现在让我们考虑 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”——这肯定不是用户想要的。
2. 如果当前目录中没有与 MobileAppSer* 通配符模式匹配的文件,grep 将按原样接收参数 MobileAppSer*,因此将其作为搜索文本“MobileAppSe”后跟 0 或更多出现“r”,因此它将尝试在当前目录的文件内容中查找文本“MobileAppSe”、“MobileAppSer”、“MobileAppSerr”、“MobileAppSerrr”等 - 也不是用户想要的。
这是正则表达式的可疑选择。乌斯塔指出了这一点。
v
vinzee
grep -nr string my_directory

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

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


嘿,所以如果我想搜索字符串而不考虑大小写,我必须这样做: grep -i -nr "my word" 。
@kiki:是的,相当于 grep -inr "my word" .
@kiki:grep 的 -r 表示递归搜索子目录,-n 表示在每行输出前加上包含该行的文件的相应行号。 man grep 描述了所有这些以及更多内容。
S
Stefan Steiger

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

grep -R "your word" .

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

grep -inR "your regex pattern" .

./* 表示当前目录中的所有文件,-R 表示递归(搜索子目录等)
谢谢。 grep -inR "[0-9a-fA-F]{32}" . 有助于在当前目录的文件中查找哈希值(十六进制字符串)。 stackoverflow.com/a/25724915/470749
m
mu is too short

还有:

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-l -i 更频繁。

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


我可以排除某些目录吗? @muistooshort
@Ferologics 应该有,从命令行检查 man find 以查看您的 find 支持哪些选项。
N
Nico Huysamen
grep -nr search_string search_dir

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

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

grep -nr string

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

grep -nr string .

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


嗨,如果我必须搜索两个单词之间有空格,我该怎么办?是否应该在引号中指定单词?即 grep -nr "my word" 。
v
vinzee

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

grep -r 'text' *

这就像一个魅力。


无需引用没有特殊字符(如空格)的搜索字符串
M
Mike Slinn

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

grep -wnr "yourString" .

在 cmd 提示符或 Windows 终端中,无法识别术语 grep
@kouty grep 是一个 Unix 命令。 itechtics.com/using-findstr-windows
j
jfhfhf839

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

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

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

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


T
Tunaki

grep -r "yourstring" * 将在任何文件和文件夹中查找 "yourstring"

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

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


e
eLRuLL

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

grep -nr yourString* .

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

所以正确的做法是:

grep -nr \w*yourString\w* .

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


但是 grep -nr yourString 也可以工作,因为它会在行中的任何位置查找裸露的 yourString(或者至少它在我的系统 OSX Lion 上是这样)
D
DimiDak
grep -R "string" /directory/

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


y
yucer

以下示例递归查找位于文件夹 path1path2path3 内某处的 *.xml*.js 文件中的 your search string

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

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


I
Iwantha

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

grep -r 'your string goes here' * 

A
AAAfarmclub

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


这些可能很棒的工具,但这并不能回答我将如何使用这些工具来完成 OP 的要求。