我正在尝试找到一种方法来扫描整个Linux系统,查找包含特定文本字符串的所有文件。只是为了澄清,我在文件中寻找文本,而不是文件名。
当我查找如何做到这一点时,我遇到了两次这个解决方案:
find / -type f -exec grep -H 'text-to-find-here' {} \;
但是,它不起作用。它似乎显示系统中的每个文件。
这是否接近正确的方法呢?如果没有,我该怎么办?这种在文件中查找文本字符串的能力对于我正在做的一些编程项目非常有用。
我正在尝试找到一种方法来扫描整个Linux系统,查找包含特定文本字符串的所有文件。只是为了澄清,我在文件中寻找文本,而不是文件名。
当我查找如何做到这一点时,我遇到了两次这个解决方案:
find / -type f -exec grep -H 'text-to-find-here' {} \;
但是,它不起作用。它似乎显示系统中的每个文件。
这是否接近正确的方法呢?如果没有,我该怎么办?这种在文件中查找文本字符串的能力对于我正在做的一些编程项目非常有用。
请执行下列操作:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
要么 -R
是递归的, -n
是行号,和 -w
代表整个单词的匹配。 -l
(小写L)可以添加到只给出匹配文件的文件名。除此之外, --exclude
, --include
, --exclude-dir
flags可用于高效搜索:
这只会搜索那些具有.c或.h扩展名的文件:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
这将排除搜索所有以.o扩展名结尾的文件:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
对于目录,可以排除特定目录 --exclude-dir
参数。例如,这将排除目录dir1 /,dir2 /以及所有匹配* .dst /:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
这对我来说非常有效,可以达到和你一样的目的。
有关更多选项,请检查 man grep
。
您可以使用 grep -ilR
:
grep -Ril "text-to-find-here" /
i
代表忽略大小写(在您的情况下是可选的)。 R
代表递归。 l
代表“显示文件名,而不是结果本身”。/
代表从机器的根开始。您可以使用 ACK。它像是 grep的 用于源代码。您可以使用它扫描整个文件系统。
做就是了:
ack 'text-to-find-here'
在根目录中。
你也可以使用 常用表达,指定文件类型等。
UPDATE
我刚刚发现 银色搜索者,这就像ack但比它快3-5倍,甚至忽略了a的模式 .gitignore
文件。
您可以使用:
grep -r "string to be searched" /path/to/dir
该 r
代表递归,因此将在指定的路径及其子目录中进行搜索。这将告诉您文件名以及打印出字符串出现的文件中的行。
或者类似于您正在尝试的命令(例如:)用于搜索所有javascript文件(* .js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
这将在文本出现的文件中打印行,但不会打印文件名。
除了这个命令,我们也可以这样写: grep -rn“要搜索的字符串”/ path / to / directory /或/ file -r:递归搜索 n:将显示匹配的行号
你可以用这个:
grep -inr "Text" folder/to/be/searched/
首先,我相信你已经习惯了 -H
代替 -l
。您也可以尝试在引号后面添加文本 {} \
。
find / -type f -exec grep -l "text-to-find-here" {} \;
假设您正在目录中搜索包含特定文本“Apache License”的文件。它将显示与下面类似的结果(输出将根据您的目录内容而有所不同)。
bash-4.1$ find . -type f -exec grep -l "Apache License" {} \;
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$
即使你没有使用像“text”和“TEXT”这样的情况,你也可以使用 -i
切换到忽略大小写。您可以阅读更多详细信息 这里。
希望这对你有所帮助。
如果你的 grep
不支持递归搜索,你可以结合使用 find
同 xargs
:
find / -type f | xargs grep 'text-to-find-here'
我发现这比格式更容易记住 find -exec
。
这将输出文件名和匹配行的内容,例如
/home/rob/file:text-to-find-here
您可能想要添加的可选标志 grep
:
-i
- 不区分大小写的搜索-l
- 仅输出找到匹配项的文件名-h
- 只输出匹配的行(不是文件名)grep -insr "pattern" *
i
:忽略PATTERN和输入文件中的大小写区别。n
:在输入文件中使用基于1的行号为每行输出添加前缀。s
:禁止有关不存在或不可读文件的错误消息。r
:递归地读取每个目录下的所有文件。grep
(GNU 要么 BSD)您可以使用 grep
用于递归搜索当前文件夹的工具,如:
grep -r "class foo" .
注意: -r
- 递归搜索子目录。
您还可以使用通配语法在特定文件中进行搜索,例如:
grep "class foo" **/*.c
注意:使用 全球选项 (**
),它以特定的扩展名或模式递归扫描所有文件。 要启用此语法,请运行: shopt -s globstar
。 你也可以使用 **/*.*
对于所有文件(不包括隐藏和没有扩展名)或任何其他模式。
如果您的错误是您的参数太长,请考虑缩小搜索范围或使用 find
语法代替如:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
或者使用 ripgrep
。
ripgrep
如果您正在处理更大的项目或大文件,您应该使用 ripgrep
相反,像:
rg "class foo" .
查看文档,安装步骤或源代码 GitHub项目页面。
它比任何其他工具都快得多 GNU/BSD grep
, ucg
, ag
, sift
, ack
, pt
或类似的,因为它建立在 Rust的正则表达式引擎 它使用有限自动机,SIMD和积极的文字优化来快速搜索。
它支持忽略指定的模式 .gitignore
文件,因此单个文件路径可以同时与多个glob模式匹配。
您可以使用常用参数,例如:
-i
- 不敏感的搜索。-I
- 忽略二进制文件。-w
- 搜索整个单词(与部分单词匹配相反)。-n
- 显示你的比赛线。-C
/--context
(例如。 -C5
) - 增加上下文,以便您查看周围的代码。--color=auto
- 标记匹配的文本。-H
- 显示找到文本的文件名。-c
- 显示匹配行的计数。可以结合使用 -H
。尝试:
find . -name "*.txt" | xargs grep -i "text_pattern"
使用 pwd
从您所在的任何目录中搜索,向下递归
grep -rnw `pwd` -e "pattern"
更新
根据您使用的grep版本,您可以省略 pwd
。在较新的版本 .
如果没有给出目录,似乎是grep的默认情况
从而:
grep -rnw -e "pattern"
要么
grep -rnw "pattern"
会做同上面的事情!