在 Windows 中,我会搜索文件夹中的单词。同样,我想知道特定单词是否出现在包含许多子目录和文件的目录中。我对 grep 语法的搜索显示我必须指定文件名,即 grep string filename
。
现在,我不知道文件名,那我该怎么办?一个朋友建议做grep -nr string
,但我不知道这是什么意思,我没有得到任何结果(直到我发出 Ctrl + C)。
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 命令。
grep -nr string my_directory
附加说明:这满足语法 grep [options] string filename
因为在类 Unix 系统中,目录是一种文件(有一个术语“常规文件”专门指在 Windows 中称为“文件”的实体)。
grep -nr string
从标准输入中读取要搜索的内容,这就是为什么它只是在那里等待您的输入,并在您按 ^C 时停止这样做(它也会在 ^D 上停止,这是组合键文件结束)。
grep -inr "my word" .
-r
表示递归搜索子目录,-n
表示在每行输出前加上包含该行的文件的相应行号。 man grep
描述了所有这些以及更多内容。
GREP:全局正则表达式打印/解析器/处理器/程序。您可以使用它来搜索当前目录。您可以指定 -R 为“递归”,这意味着程序搜索所有子文件夹及其子文件夹及其子文件夹的子文件夹等。
grep -R "your word" .
-n
将打印文件中匹配的行号。
-i
将搜索不区分大小写(大写/非大写字母)。
grep -inR "your regex pattern" .
grep -inR "[0-9a-fA-F]{32}" .
有助于在当前目录的文件中查找哈希值(十六进制字符串)。 stackoverflow.com/a/25724915/470749
还有:
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
,那么您会遇到文件名包含空格的问题,因此使用它们是一个好习惯。
man find
以查看您的 find
支持哪些选项。
grep -nr search_string search_dir
将对 search_string 进行 RECURSIVE(表示目录及其所有子目录)搜索。 (正如usta正确回答的那样)。
您朋友的建议没有得到任何答复的原因是:
grep -nr string
是因为没有指定目录。如果您位于要在其中进行搜索的目录中,则必须执行以下操作:
grep -nr string .
包含“。”很重要。字符,因为这告诉 grep 搜索这个目录。
为什么不进行递归搜索以查找子目录中的所有实例:
grep -r 'text' *
这就像一个魅力。
与@eLRuLL 发布的答案类似,指定尊重单词边界的搜索的更简单方法是使用 -w
选项:
grep -wnr "yourString" .
我喜欢使用的另一个选项:
find folder_name -type f -exec grep your_text {} \;
-type f 只返回文件而不是文件夹
-exec 和 {} 对在搜索中找到的文件运行 grep(确切的语法是“-exec command {}”)。
grep -r "yourstring" * 将在任何文件和文件夹中查找 "yourstring"
现在,如果您想同时查找两个不同的字符串,您可以随时使用选项 E 并添加单词进行搜索。休息后的例子
grep -rE "yourstring|yourotherstring|$" * 将搜索 yourstring 或 yourotherstring 匹配的列表位置
您选择的答案很好,并且有效,但这不是正确的方法,因为:
grep -nr yourString* .
这实际上搜索字符串 "yourStrin"
和 "g"
0 次或多次。
所以正确的做法是:
grep -nr \w*yourString\w* .
此命令在当前文件夹中搜索包含前后任意字符的字符串。
grep -nr yourString
也可以工作,因为它会在行中的任何位置查找裸露的 yourString
(或者至少它在我的系统 OSX Lion 上是这样)
grep -R "string" /directory/
当 -r 没有时, -R 也遵循符号链接。
以下示例递归查找位于文件夹 path1
、path2
和 path3
内某处的 *.xml
和 *.js
文件中的 your search string
。
grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3
因此,您可以在文件的子集中搜索许多目录,只需在末尾提供路径即可。
在目录中运行(终端)以下命令。它也会递归地检查子目录内部。
grep -r 'your string goes here' *
不要使用 grep。下载 Silver Searcher 或 ripgrep。它们都很出色,而且比 grep 或 ack 更快,有很多选项。
不定期副业成功案例分享
*
有什么关系?它要么导致 shell 通配符扩展(如果有与通配符模式匹配的文件名),要么 grep 将其作为*
之前字符的 0 个或多个重复运算符。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”——这肯定不是用户想要的。MobileAppSer*
通配符模式匹配的文件,grep
将按原样接收参数MobileAppSer*
,因此将其作为搜索文本“MobileAppSe”后跟 0 或更多出现“r”,因此它将尝试在当前目录的文件内容中查找文本“MobileAppSe”、“MobileAppSer”、“MobileAppSerr”、“MobileAppSerrr”等 - 也不是用户想要的。