在Windows中,我会搜索在文件夹中查找单词。同样,我想知道在包含许多子目录和文件的目录中是否出现特定单词。我对grep语法的搜索显示我必须指定文件名,即grep string filename
。
现在,我不知道文件名,所以我该怎么办?
一位朋友建议做grep -nr string
,但我不知道这意味着什么,我没有得到任何结果(在我发出 ctrl + c 之前没有回复)。
答案 0 :(得分:704)
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.java
或MobileAppServlet.class
或MobileAppServlet.txt
; 'MobileAppASer*.*'
是另一种做同样事情的方法。)
要检查更多参数,请使用 man grep 命令。
答案 1 :(得分:107)
grep -nr string my_directory
附加说明:这满足语法grep [options] string filename
,因为在类Unix系统中,目录是一种文件(有一个术语“常规文件”,专门指代被称为“文件”的实体)在Windows中。
grep -nr string
从标准输入中读取要搜索的内容,这就是为什么它只是等待你的输入,并在你按^ C时停止这样做(它也会在^ D上停止,是文件结尾的关键组合。
答案 2 :(得分:55)
GREP :全球正则表达式打印/分析器/处理器/程序
您可以使用它来搜索当前目录。
您可以为“递归”指定-R,这意味着程序将搜索所有子文件夹及其子文件夹及其子文件夹的子文件夹等。
grep -R "your word" .
-n
将打印文件中匹配的行号
-i
将搜索不区分大小写的字母(大写/非大写字母)。
grep -inR "your regex pattern" .
答案 3 :(得分:24)
还有:
find directory_name -type f -print0 | xargs -0 grep -li word
但这对初学者来说可能有点多。
find
是一个通用目录walker / lister,-type f
表示“查找普通文件而不是目录和命名管道以及你有什么”,-print0
表示“打印它们”使用空字符作为分隔符的标准输出“。来自find
的输出被发送到xargs -0
并且使用空字符作为记录分隔符(而不是标准换行符)并且应用{以块为单位抓取其标准输入(以避免命令行长度限制) {1}}到每组文件。在grep -li word
上,grep
表示“列出匹配的文件”,-l
表示“不区分大小写”;您通常可以组合使用单个字符选项,这样您-i
的频率会高于-li
。
如果您不使用-l -i
和-print0
,那么您将遇到包含空格的文件名的问题,因此使用它们是一个好习惯。
答案 4 :(得分:22)
grep -nr search_string search_dir
将执行RECURSIVE(意味着目录及其所有子目录)搜索search_string。 (正如usta正确回答的那样)。
你没有得到朋友建议的任何答案的原因:
grep -nr string
是因为没有指定目录。如果您位于要进行搜索的目录中,则必须执行以下操作:
grep -nr string .
包含'。'很重要。字符,因为这告诉grep搜索这个目录。
答案 5 :(得分:4)
为什么不进行递归搜索以查找子目录中的所有实例:
grep -r 'text' *
这就像一个魅力。
答案 6 :(得分:4)
grep -r "yourstring" *
会发现" yourstring"在任何文件和文件夹中现在,如果您想同时查找两个不同的字符串,您可以随时使用选项E并为搜索添加单词。休息后的例子
grep -rE "yourstring|yourotherstring|$" *
将搜索yourstring
或yourotherstring
匹配的列表位置答案 7 :(得分:3)
我喜欢使用的另一种选择:
find folder_name -type f -exec grep your_text {} \;
-type f只返回文件而不是文件夹
-exec和{}在搜索中找到的文件上运行grep(确切的语法是“-exec command {}”)。
答案 8 :(得分:1)
您选择的答案很好,而且有效,但这不是正确的方法,因为:
grep -nr yourString* .
这实际上会搜索字符串"yourStrin"
和"g"
0或多次。
所以正确的方法是:
grep -nr \w*yourString\w* .
此命令在当前文件夹之前和之后搜索包含任何字符的字符串。
答案 9 :(得分:1)
grep -R "string" /directory/
它曾经是grep -r,但我只是注意到它在我的版本中不再起作用。
grep --version
grep (GNU grep) 3.1
答案 10 :(得分:1)
在目录中运行(终端)以下命令。它将也递归地检查子目录内部。
grep -r 'your string goes here' *
答案 11 :(得分:0)
与@eLRuLL发布的答案类似,指定符合字词边界的搜索的更简单方法是使用-w
选项:
grep -wnr "yourString" .
答案 12 :(得分:0)
以下示例递归查找位于文件夹your search string
,*.xml
和*.js
中的path1
和path2
文件中的path3
grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3
因此,您可以在文件的子集中搜索许多目录,只需在末尾提供路径即可。
答案 13 :(得分:-2)
不要使用grep。下载Silver Searcher或ripgrep。他们都很出色,而且比grep或ack更快,有很多选择。