如何在 Linux 上找到包含特定文本的所有文件?

问题描述:

想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

如何在文件内容中找到包含特定文本字符串的所有文件?

以下不起作用。它似乎显示了系统中的每个文件。

find / -type f -exec grep -H 'text-to-find-here' {} \;

解决方案1:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

请执行下列操作:

grep -rnw '/path/to/somewhere/' -e 'pattern'

-r 或 -R 是递归的,

-n 是行号,并且

-w 代表匹配整个单词。

-l(小写 L)可以添加以仅给出匹配文件的文件名。

-e 是搜索过程中使用的模式

除了这些,–exclude、–include、–exclude-dir 标志可用于高效搜索:

这只会搜索具有 .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 -rnw --exclude=*.o 'directory' -e "pattern"

值得注意的是:似乎 r 选项是惰性的(首先遍历深度,而不是在第一个目录之后停止),而 R 是贪婪的(将正确遍历整个树)。

grep -rnw "String I was looking for" 完成了我需要的操作。谢谢!

注意(尤其是新手):上述命令中的引号很重要。

@Eliran Malka R 和 r 都将正确遍历目录,但 R 将遵循符号链接。

解决方案2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

使用 grep -ilR:

grep -Ril "text-to-find-here" /

i 代表忽略大小写(在您的情况下是可选的)。

R代表递归。

l 代表“显示文件名,而不是结果本身”。

/ 代表从机器的根目录开始。

根据我的经验,-i 会使它变慢很多,所以如果没有必要就不要使用它。在某个目录中对其进行测试,然后进行概括。它应该在几分钟内完成。我认为正则表达式会使它变慢。但是我的评论是基于假设的,我建议您在行前使用 time 进行测试。

是的,/* 代表它。无论如何,我刚刚对其进行了测试,发现只有 / 有效。

如果您不使用正则表达式进行搜索,则可以在大多数系统上使用 fgrep 代替 grep。

是的@markle976,实际上来自 man grep: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings。

您可以将 / 替换为目录 grep -Ril "text-to-find-here" ~/sites/ 的路径或使用 .当前目录 grep -Ril "text-to-find-here" .

解决方案3:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

您可以使用 ack。它类似于源代码的 grep。您可以使用它扫描整个文件系统。

做就是了:

ack 'text-to-find-here'

在您的根目录中。

您还可以使用 regular expressions,指定文件类型等。

更新

我刚刚发现 The Silver Searcher,它类似于 ack,但比它快 3-5 倍,甚至忽略了 .gitignore 文件中的模式。

非常有用,简单,快速。警告:“在 Debian 派生的发行版上,ack 被打包为“ack-grep”,因为“ack”已经存在”(来自 beyondgrep.com/install)。您最终可能会在这些 Linux 上运行汉字代码转换器......

ack 或 ack-grep 有很好的亮点,但 find+grep 正确使用时性能要好得多

请注意,ripgrep 比此处提到的任何其他内容都快,包括 The Silver Searcher 和普通的 'ol grep。参见this blog post 以获取证据。

解决方案4:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

您可以使用:

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 “String to search” /path/to/directory/or/file -r: recursive search n: 将显示匹配的行号

感谢您的“查找”版本!能够通过 '.js' 或 '.txt' 等进行过滤非常重要。没有人愿意花费数小时等待 grep 完成对上次家庭度假的所有数 GB 视频的搜索,即使命令是更容易打字。

解决方案5:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

带有行号的递归和不区分大小写的 grep:

grep -inr "Text" folder/to/be/searched/

如果添加 -A3 会更好

-i 不区分大小写,-n 显示行号,-r 递归读取子目录中的所有文件

解决方案6:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

grep(GNU 或 BSD)

您可以使用 grep 工具递归搜索当前文件夹,例如:

grep -r "class foo" .

注意:-r - 递归搜索子目录。

您还可以使用通配符语法在特定文件中进行搜索,例如:

grep "class foo" **/*.c

注意:通过使用 globbing option (**),它递归地扫描具有特定扩展名或模式的所有文件。 要启用此语法,请运行:shopt -s globstar。您还可以将 **/. 用于所有文件(不包括隐藏且无扩展名)或任何其他模式。

如果您遇到参数太长的错误,请考虑缩小搜索范围,或改用 find 语法,例如:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

或者,使用 ripgrep。

ripgrep

如果您正在处理较大的项目或大文件,则应改用 ripgrep,例如:

rg "class foo" .

查看 GitHub project page 上的文档、安装步骤或源代码。

它比任何其他工具(如 GNU/BSD grep、ucg、ag、sift、ack、pt 或类似工具都快得多,因为它构建在 {9 之上它使用有限自动机、SIMD 和积极的文字优化来使搜索非常快速。

它支持在 .gitignore 文件中指定的忽略模式,因此单个文件路径可以同时与多个 glob 模式匹配。

您可以使用常用参数,例如:

-i - 不敏感搜索。

-I - 忽略二进制文件。

-w - 搜索整个单词(与部分单词匹配相反)。

-n - 显示匹配的行。

-C/–context (eg -C5) - 增加上下文,所以你可以看到周围的代码。

–color=auto - 标记匹配的文本。

-H - 显示找到文本的文件名。

-c - 显示匹配行数。可以与 -H 结合使用。

我还发现扩展通配符很有用。但请记住,如果文件数量确实很大,您可能会收到“参数列表太长”错误。 (简单的 globbing 也容易出现这种错误)。

解决方案7:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

包含给定文本的文件名列表

首先,我相信您使用的是 -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 开关忽略大小写。您可以阅读更多详细信息here。

希望这对您有所帮助。

该命令的作用是:find 会将它找到的所有路径传递给命令 grep -l "text-to-find-here" "。您可以对文件名添加限制,例如 find / -iname "*.txt" 只搜索名称以 .txt 结尾的文件

@Auxiliary - 包含一个示例输出以避免读者混淆。

@Mene 这是一个真正可悲的状态,辅助的评论比你的投票多......即使他们的评论来自 2014 年,而你的评论是 2017 年,他们的评论有 6,而它应该正好是 0,而你的评论只有一个(现在是两个)是这不是我愿意相信的。

@Mene 据说 -iname 不区分大小写,这意味着它还会找到 .TXT 文件,例如,以及 TxT 和 TXt 等。

解决方案8:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

当您在 Linux 上搜索特定文本时,此 grep 命令将为您提供精确的结果 -

grep -inRsH “Text to be searched” /path/to/dir (it can be ‘.’)

i 代表忽略大小写区别

代表递归,它还包括符号链接。最好使用“R”而不是“r”

代表“它将打印行号”。

s 代表“抑制错误消息”

H 代表“它将打印每个匹配的文件名”

但这不会显示包含该文本的“文件”

此组合将为您提供 lineno、文件名以及您搜索的文本。 @FiruzzZ 尝试一次

解决方案9:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

如果您的 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 - 只输出匹配的行(不是文件名)

如果 find 没有找到任何内容,这相当于没有文件名的 grep 'text-to-find-here'。这将挂起并等待用户输入!将 --no-run-if-empty 作为选项添加到 xargs。

如果文件或目录名称包含空格(xargs 解释为分隔符的字符),则 find 和 xargs 的这种组合不会按预期工作。使用 find … -exec grep … +。如果您坚持将 find 与 xargs 一起使用,请使用 -print0 和 -0。

解决方案10:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

grep -insr "pattern" *

i:忽略 PATTERN 和输入文件中的大小写区别。

n:在其输入文件中使用从 1 开始的行号作为每行输出的前缀。

s:抑制有关不存在或不可读文件的错误消息。

r:递归读取每个目录下的所有文件。

您能否解释一下您的答案如何比其他答案有所改进,或者它与其他答案有何不同?

记住并不复杂,将涵盖所有模式(区分大小写 -> 关闭,包括文件名和行号,并将进行递归搜索等),最后使用“*”将搜索所有目录(无需指定任何路径或目录名称)。

抱歉,我应该更清楚:如果您可以在答案中包含该解释,那就太好了。就目前而言,尤其是已经有很多其他类似的答案,很难从如此简短的答案中看出尝试它对接受的答案或赞成的答案之一有什么好处。

@AmosM.Carpenter 我喜欢这个答案的一件事是指出了抑制参数,它可以帮助过滤掉与获得我们真正想要的结果无关的噪音。 Grep 在某些“文件”上打印诸如“功能未实现”、“无效参数”、“资源不可用”等错误。

@leetNightshade:我假设您正在向我发表评论,因为我要求对稀疏的原始帖子进行解释。请参阅 Fabio 的精彩 revision 以了解我之前的评论。

解决方案11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

有一个名为 The Silversearcher 的新实用程序

sudo apt install silversearcher-ag

它与 Git 和其他 VCS 密切合作。所以你不会在 .git 或其他目录中得到任何东西。

你可以简单地使用

ag "Search query"

它会为你完成任务!

好决定!。我第一次下载并使用它。输出结果信息量很大,色彩丰富,很有帮助。这个编将永远留在我的机器中。我也把它放在我的“安装新电脑”程序列表中。干杯!!

原文链接:https://www.huntsbot.com/qa/ma2v/how-do-i-find-all-files-containing-specific-text-on-linux?lang=zh_CN

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值