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

kik*_*iki 497 grep

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

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

Man*_*jan 773

grep -nr 'yourString*' .
Run Code Online (Sandbox Code Playgroud)

最后的点搜索当前目录.每个参数的含义:

-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)
Run Code Online (Sandbox Code Playgroud)

grep -nr 'MobileAppSer*' . (会发现MobileAppServlet.javaMobileAppServlet.classMobileAppServlet.txt; 'MobileAppASer*.*'另一种方式做同样的事情.)

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

  • 什么是`*`的业务?它将导致shell通配符扩展(如果存在与通配符模式匹配的文件名),或者grep将它作为"*"之前的字符的0或更多重复运算符. (13认同)
  • 现在让我们考虑`grep -nr MobileAppSer*的两种可能性.1.假设我们在当前目录中有3个文件匹配`MobileAppSer*`通配符模式:名为`MobileAppServlet.java`,`MobileAppServlet.class`,`MobileAppServlet.txt `.然后`grep`将被调用如下:`grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .`.这意味着在文件MobileAppServlet.java,MobileAppServlet.txt和当前目录中的其他位置搜索文本"MobileAppServlet.class" - 这肯定不是用户想要的. (7认同)
  • 2.如果当前目录中没有与`MobileAppSer*`通配符模式匹配的文件,`grep`将按原样接收参数`MobileAppSer*`,因此将其作为搜索文本"MobileAppSe"后跟0或更多出现"r",因此它将尝试在当前目录的文件内容中找到文本"MobileAppSe","MobileAppSer","MobileAppSerr","MobileAppSerrr"等 - 而不是用户想要的内容. (7认同)
  • 这是正则表达式的一个可疑选择.Usta指出了这一点. (5认同)

ust*_*sta 110

grep -nr string my_directory

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

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

  • @kiki:`-r` for grep表示在子目录中递归搜索,`-n`表示每行输出前缀,包含该行的文件的相应行号.`man grep`描述了所有这些,等等. (16认同)
  • @kiki:是的,这相当于`grep -inr"我的单词".` (2认同)

Ste*_*ger 59

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

grep -R "your word" .
Run Code Online (Sandbox Code Playgroud)

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

grep -inR "your regex pattern" .
Run Code Online (Sandbox Code Playgroud)

  • ./*表示当前目录中的所有文件,-R表示递归(搜索子目录等) (3认同)

Nic*_*men 24

grep -nr search_string search_dir
Run Code Online (Sandbox Code Playgroud)

将执行RECURSIVE(意味着目录及其所有子目录)搜索search_string.(正如usta正确回答的那样).

你没有得到朋友的建议的原因:

grep -nr string
Run Code Online (Sandbox Code Playgroud)

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

grep -nr string .
Run Code Online (Sandbox Code Playgroud)

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


mu *_*ort 24

还有:

find directory_name -type f -print0 | xargs -0 grep -li word
Run Code Online (Sandbox Code Playgroud)

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

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

如果你不使用-print0,并-0然后你会碰到与包含空格,以便使用它们是一个好习惯文件名的问题.


Mik*_*inn 10

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

grep -wnr "yourString" .
Run Code Online (Sandbox Code Playgroud)


jfh*_*839 5

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

find folder_name -type f -exec grep your_text  {} \;
Run Code Online (Sandbox Code Playgroud)

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

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


Pax*_*ell 5

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

grep -r 'text' *

这就像一个魅力。


小智 5

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

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

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


Dim*_*Dak 5

grep -R "string" /directory/
Run Code Online (Sandbox Code Playgroud)

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