如何在 Linux 上找到包含特定文本的所有文件?
Posted
技术标签:
【中文标题】如何在 Linux 上找到包含特定文本的所有文件?【英文标题】:How do I find all files containing specific text on Linux? 【发布时间】:2013-06-02 03:35:39 【问题描述】:我正在尝试找到一种方法来扫描我的整个 Linux 系统以查找包含特定文本字符串的所有文件。澄清一下,我在文件中查找文本,而不是在文件名中。
当我在查找如何做到这一点时,我两次遇到了这个解决方案:
find / -type f -exec grep -H 'text-to-find-here' \;
但是,它不起作用。它似乎显示了系统中的每个文件。
这是否接近正确的方法?如果没有,我该怎么办?这种在文件中查找文本字符串的能力对于我正在做的一些编程项目非常有用。
【问题讨论】:
请记住,grep 会将任何.
解释为单字符通配符等。我的建议是始终使用 fgrep 或 egrep。
不管怎样,你快到了!只需将-H
替换为-l
(也可以将grep
替换为fgrep
)。要排除具有某些名称模式的文件,您可以使用find
以更高级的方式。不过,学习使用find
是值得的。只需man find
。
find … -exec <cmd> +
比find … -exec <cmd> \;
更容易输入和更快。它仅在<cmd>
接受任意数量的文件名参数时才有效。如果 <cmd>
像 Python 或 Ruby 脚本一样启动缓慢,则执行时间的节省尤其大。
要在给定路径中进行非递归搜索,命令是`grep --include=*.txt -snw "pattern" thepath/*。
@StéphaneLaurent 我认为你把事情复杂化了。就说grep "pattern" path/*.txt
【参考方案1】:
执行以下操作:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
或 -R
是递归的,
-n
是行号,并且
-w
代表匹配整个单词。
可以添加-l
(小写L)来给出匹配文件的文件名。
-e
是搜索过程中使用的模式
除此之外,--exclude
、--include
、--exclude-dir
标志可用于高效搜索:
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
。
【讨论】:
使用 --exclude。比如 "grep -rnw --exclude=*.o 'directory' -e "pattern" 值得注意的是:r
选项似乎是惰性的(首先遍历深度,而不是在第一个目录之后停止),而 R
是贪婪的(将正确遍历整个树)。
grep -rnw "String I was looking for" 完成了我需要的工作。谢谢!
注意(尤其是新手):上述命令中的引号很重要。
@Eliran Malka R
en r
将正确遍历目录,但 R
将遵循符号链接。【参考方案2】:
你可以使用grep -ilR
:
grep -Ril "text-to-find-here" /
i
代表忽略大小写(在您的情况下是可选的)。
R
代表递归。
l
代表“显示文件名,而不是结果本身”。
/
代表从机器的根目录开始。
【讨论】:
根据我的经验,-i
会使它变慢很多,所以如果没有必要就不要使用它。在某个目录中对其进行测试,然后进行概括。它应该在几分钟内完成。我认为正则表达式会使它变慢。但是我的cmets是基于假设的,我建议你在行前用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】:
您可以使用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 比这里提到的任何其他东西都快,包括 Silver Searcher 和普通的 'ol grep。请参阅this blog post 以获取证据。【参考方案4】:你可以使用:
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/or/file -r:递归搜索 n:将显示匹配的行号
【讨论】:
感谢查找版本。我的 grep 版本(NAS 的 busybox)没有 -r 选项,我真的需要另一个解决方案! 感谢您的“查找”版本!能够通过 '.js' 或 '.txt' 等进行过滤非常重要。没有人愿意花费数小时等待 grep 完成对上一个家庭的所有数 GB 视频的搜索假期,即使命令更容易输入。 grep 比接受的版本更好,因为接受的不搜索半字【参考方案5】:你可以用这个:
grep -inr "Text" folder/to/be/searched/
【讨论】:
最简单、详细、递归且不区分大小写。竖起大拇指。 如果加上-A3就更好了【参考方案6】:
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
等任何其他工具都快得多,因为它建立在顶部Rust's regex engine 使用有限自动机、SIMD 和积极的文字优化来使搜索非常快速。
它支持在.gitignore
文件中指定的忽略模式,因此单个文件路径可以同时与多个glob模式匹配。
您可以使用常用参数,例如:
-i
- 不敏感的搜索。
-I
- 忽略二进制文件。
-w
- 搜索整个单词(与部分单词匹配相反)。
-n
- 显示你的比赛路线。
-C
/--context
(例如-C5
) - 增加上下文,以便您看到周围的代码。
--color=auto
- 标记匹配的文本。
-H
- 显示找到文本的文件名。
-c
- 显示匹配行数。可以与-H
结合使用。
【讨论】:
我还发现扩展通配符很有用。但请记住,如果文件数量确实很大,您可能会收到“参数列表太长”错误。 (简单的globbing也容易出现这种错误)。 对于吸入整个文件系统,rg 比几乎任何其他工具都要痛苦得多。 大声笑,对不起,我昨天错误地否决了这个答案,现在我无法更改它;_;这里有 10 个机器人零件表示歉意 它可以用一个更好的名字,不过……我不是每天都用它,当我想用它的时候很难记住这个名字!【参考方案7】:包含给定文本的文件名列表
首先,我相信您使用的是-H
而不是-l
。您也可以尝试在引号内添加文本,后跟 \
。
find / -type f -exec grep -l "text-to-find-here" \;
示例
假设您正在目录中搜索包含特定文本“Apache 许可证”的文件。它将显示类似于下面的结果(输出将根据您的目录内容而有所不同)。
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" <file found>"
。您可以对文件名添加限制,例如find / -iname "*.txt"
仅搜索名称以 .txt
结尾的文件
@Auxiliary - 包含一个示例输出以避免读者混淆。
@Mene 这是一个真正可悲的状态,辅助的评论比你有更多的投票......即使他们的评论来自 2014 年,而你的评论来自 2017 年,他们的评论有 6,而它应该正好是 0 而你的我不想相信只有一个(现在两个)。
@Mene 话虽如此,-iname
不区分大小写,这意味着它还会查找 .TXT 文件,例如 TxT 和 TXt 等。 【参考方案8】:
如果您的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
。【参考方案9】:
grep -insr "pattern" *
i
:忽略 PATTERN 和输入文件中的大小写区别。
n
:在输入文件中为每行输出添加从 1 开始的行号前缀。
s
:禁止显示有关不存在或不可读文件的错误消息。
r
:递归读取每个目录下的所有文件。
【讨论】:
你能解释一下你的答案如何比其他答案有所改进,或者它与其他答案有什么不同吗? 记住并不复杂,将涵盖所有模式(区分大小写 -> 关闭,包括文件名和行号,并将进行递归搜索等),最后使用“*”将搜索所有目录(无需指定任何路径或目录名)。 对不起,我应该更清楚:如果您可以在答案中包含该解释,那就太好了。就目前而言,尤其是已经有许多其他类似的答案,很难从如此简短的答案中看出尝试 it 而不是接受的答案或赞成的答案之一会有什么好处。 @AmosM.Carpenter 我喜欢这个答案的一件事是指出了抑制参数,它可以帮助过滤掉与获得我们真正想要的结果无关的噪音。 Grep 在某些“文件”上打印错误,例如“功能未实现”、“无效参数”、“资源不可用”等。 @leetNightshade:我假设您正在向我发表评论,因为我要求对稀疏的原始帖子进行解释。请参阅 Fabio 的伟大 revision 了解我以前的 cmets。【参考方案10】:有一个名为 The Silversearcher
的新实用程序sudo apt install silversearcher-ag
它与 Git 和其他 VCS 密切合作。所以你不会在 .git 或其他目录中得到任何东西。
你可以简单地使用
ag "Search query"
它会为你完成任务!
【讨论】:
好电话!。我第一次下载并使用它。输出结果信息量很大,色彩丰富,很有帮助。这个编将永远留在我的机器中。我也把它放在我的“安装新电脑”程序列表中。干杯!!【参考方案11】:如何在 Linux 上找到所有包含特定文本的文件? (...)
我两次遇到这个解决方案:
find / -type f -exec grep -H 'text-to-find-here' \;
如果像您的示例一样使用 find,最好在命令末尾添加 -s
(--no-messages
) 到 grep
和 2>/dev/null
,以避免大量 Permission denied 由grep
和find
发出的消息:
find / -type f -exec grep -sH 'text-to-find-here' \; 2>/dev/null
find 是在类 Unix 平台上搜索文件的标准工具 - 在查找特定文本时与 grep 结合使用。顺便说一下,find 命令经常与xargs 结合使用。
为了相同的目的而存在更快、更简单的工具 - 见下文。最好尝试一下,当然,前提是它们可以在您的平台上使用:
更快更简单的替代方案
RipGrep - 最快的搜索工具:
rg 'text-to-find-here' / -l
The Silver Searcher:
ag 'text-to-find-here' / -l
ack:
ack 'text-to-find-here' / -l
注意:您也可以在这些命令中添加2>/dev/null
,以隐藏许多错误消息。
警告:除非你真的无法避免,否则不要从'/' (the root directory) 搜索,以免搜索冗长且效率低下! 所以在上面的例子中,你最好将 '/' 替换为子目录名,例如“/home”取决于您实际要搜索的位置...
【讨论】:
'find 是在类 Unix 平台上搜索包含特定文本的文件的标准工具' 对我来说似乎相当模糊。即使除了递归grep
find
也不会直接在文件内部搜索文本。也许这些额外的工具对一些老手和那些已经习惯了的人很有用,例如grep
根本不会给他们任何时间(我当然不会)。并不是说它们没用。
"....包含特定文本..." :这部分句子不准确(因为处理这部分搜索的不是 find 本身)。已编辑。谢谢。
很高兴能帮上忙!快速浏览的唯一其他事情是将单词 folder 更改为 directory 但我知道这是我的十字军东征,我永远不会完全获胜。虽然不放弃......
为什么不用“目录”而不是“文件夹”,但为什么呢?请分享您的“十字军东征”!
我说的是使用目录!参考:你最好用子文件夹名称替换'/' 这是我的一个小烦恼.. 特别是因为甚至 Windows 过去都称它为“目录”。啊..也许你明白了。为什么?好吧,因为这就是它的名字。在文件系统级别也称为。并以这种方式看待它:它曾经被称为(对于 DOS)fol
?不,当然不;它被称为 dir
(我相信它仍然是)。文件夹是为(我猜)用户友好性而设计的,尽管在这种情况下,对于不太“高级”的用户来说,它可能会使它变得愚蠢?【参考方案12】:
试试:
find . -name "*.txt" | xargs grep -i "text_pattern"
【讨论】:
这实际上是一个最好的例子,说明何时不要像那样使用xargs
.. 考虑一下。 echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
。此处的xargs
与错误文件匹配,与预期文件不匹配。要么使用find .. -print0 | xargs -0 ...
,但这是无用的管道或更好的find ... -exec grep ... +
【参考方案13】:
使用pwd
从您所在的任何目录中搜索,向下递归
grep -rnw `pwd` -e "pattern"
更新
根据您使用的 grep 版本,您可以省略 pwd
。在较新版本上,如果没有给出目录,.
似乎是 grep 的默认情况
因此:
grep -rnw -e "pattern"
或
grep -rnw "pattern"
会做和上面一样的事情!
【讨论】:
使用pwd
完全没有必要,因为它是默认设置。 grep -rnw "pattern"
就够了。
事实上 grep -rnw
和类似的答案就像三年前一样,我看不出这个答案是如何增加价值的。
所选答案不显示默认模式,5 个人似乎发现它有用
“默认模式”是什么意思?接受的答案包含grep -rnw '/path/to/somewhere/' -e "pattern"
,这就是您在这里所拥有的。在 230 万次访问后获得 5 票并不意味着那么多。
我同意 :-) 我在原始答案中缺少的是您根本不必提供路径或递归搜索当前目录的用例,这未反映在接受的答案。因此,深入了解 grep 是一次很好的学习体验。【参考方案14】:
grep
即使我们不查找字符串也可以使用。
简单地运行,
grep -RIl "" .
将打印出所有文本文件的路径,即那些只包含可打印字符的文件。
【讨论】:
我不知道这比仅仅使用ls
或 find
(用于递归)更好【参考方案15】:
如果您严格要使用find
,请使用find + grep
:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' \;
步骤:
-
使用
find
搜索文件,
对所有这些都执行grep
。
这使您可以使用find
查找文件。
grep
某些文件,请使用-name Pattern
:
find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' \;
您可以使用find
的不同选项来改进您的文件搜索。
【讨论】:
有什么区别?它可以与文件路径中的空格一起使用吗? 不提供找到的文件的文件名。【参考方案16】:grep -lrnw '/root/Desktop/ipozal' -e 'geolocation'
例如:
我的文件夹名称是“ipozal” 它放在“/root/Desktop” 我想在“地理位置”中的所有文件中找到此文本【讨论】:
欢迎来到 Stack Overflow!请考虑为此代码块添加描述或解释。 1.在桌面上备份您的文件夹 2.我的项目名称是'ipozal' 然后使用此命令并将 'ipozal' 替换为您的文件夹名称,以查找包含此文本 'geolocation' 的文件 很好的解释——你应该编辑你的答案,以便包含解释。【参考方案17】:Silver Searcher 是一个了不起的工具,但 ripgrep 可能会更好。
它可以在 Linux、Mac 和 Windows 上运行,几个月前在Hacker News 上写过(这里有 Andrew Gallant 博客的链接,其中有一个 GitHub 链接):
Ripgrep – A new command line search tool
【讨论】:
【参考方案18】:这里有几个可以用来搜索文件的命令列表。
grep "text string to search” directory-path
grep [option] "text string to search” directory-path
grep -r "text string to search” directory-path
grep -r -H "text string to search” directory-path
egrep -R "word-1|word-2” directory-path
egrep -w -R "word-1|word-2” directory-path
【讨论】:
这是对现有答案的补充? @fedorquiegrep
等同于grep -E
意思是--extended-regexp
你可以在这里找到详细信息unix.stackexchange.com/a/17951/196072【参考方案19】:
grep 使用 'rl' 的简单程度让我着迷:
grep -rl 'pattern_to_find' /path/where/to/find
-r to recursively find a file / directory inside directories..
-l to list files matching the 'pattern'
使用不带“l”的“-r”来查看文件名后跟找到该模式的文本!
grep -r 'pattern_to_find' /path/where/to/find
效果非常好……
【讨论】:
这也适用于Git Bash (Windows)。 但这意味着必须搜索每个文件(文件名或文件扩展名级别没有过滤器,如.txt
)。或者有没有办法做到这一点?【参考方案20】:
find /path -type f -exec grep -l "string" \;
来自cmets的解释
find 是一个命令,可让您在给定路径的子目录中查找文件和其他对象,例如目录和链接。如果你没有指定文件名应该满足的掩码,它会枚举所有目录对象。
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing with the filename
【讨论】:
【参考方案21】:希望对您有所帮助...
扩展grep
以在输出中提供更多信息,例如,获取文本所在文件中的行号,可以按如下方式完成:
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
如果您知道文件类型是什么,您可以通过指定要搜索的文件类型扩展名来缩小搜索范围,在本例中为 .pas
或 .dfm
文件:
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
选项的简短说明:
find
中的.
指定来自当前目录。
-name
"*.*
" :适用于所有文件
( -name "*.pas
" -o -name "*.dfm
" ) : 仅*.pas
OR *.dfm
文件,或用-o
指定
-type f
表示您正在查找文件
-print0
和 |
(管道)另一侧的 --null
是关键,将文件名从 find
传递到嵌入在 grep
中的 grep
,允许传递文件名文件名中带有空格,允许 grep 将路径和文件名视为一个字符串,而不是在每个空格上分开。
【讨论】:
-name '*.*'
不是你说的;它不会拾取名为“文件”的文件,因为该模式不等同于该文件(没有 .ext);但是*
会(除了 . 文件)。但是还有另一件事:如果您想要所有文件,为什么还要首先指定文件名?没有其他评论 - 除了很高兴知道仍然有人不使用 MS 术语“文件夹”(真的在说够之后我不会添加,但我想指出你所做的稍微不正确的陈述带有文件名 - 以及“全部”情况下的冗余/无用)。【参考方案22】:
一个简单的find
可以得心应手。在您的 ~/.bashrc
文件中为其命名:
alias ffind find / -type f | xargs grep
启动一个新的终端并发出:
ffind 'text-to-find-here'
【讨论】:
【参考方案23】:grep 是您实现这一目标的好朋友。
grep -r <text_fo_find> <directory>
如果你不关心要查找的文本的大小写,那么使用:
grep -ir <text_to_find> <directory>
【讨论】:
在我的情况下,即使我指定了目录,它看起来也到处搜索 @Pathros 可能与启用递归以及您指定的目录有关。换句话说,递归确实会以这种方式改变事情。 @Pathros 哦,如果搜索字符串中有任何-
,您需要将 --
传递给 grep第一的;否则可能会导致有趣的副作用!【参考方案24】:
我写了一个Python script,它做了类似的事情。这就是人们应该如何使用这个脚本。
./sniff.py path pattern_to_search [file_pattern]
第一个参数path
是我们将递归搜索的目录。第二个参数pattern_to_search
是我们要在文件中搜索的正则表达式。我们使用Pythonre
库中定义的正则表达式格式。在此脚本中,.
也匹配换行符。
第三个参数file_pattern
是可选的。这是另一个适用于文件名的正则表达式。只有那些匹配这个正则表达式的文件才会被考虑。
例如,如果我想搜索扩展名为 py
且包含 Pool(
后跟单词 Adaptor
的 Python 文件,我会执行以下操作,
./sniff.py . "Pool(.*?Adaptor" .*py
./Demos/snippets/cubeMeshSigNeur.py:146
./Demos/snippets/testSigNeur.py:259
./python/moose/multiscale/core/mumbl.py:206
./Demos/snippets/multiComptSigNeur.py:268
瞧,它会生成匹配文件的路径和找到匹配项的行号。如果找到多个匹配项,则每个行号将附加到文件名。
【讨论】:
【参考方案25】:试试:
find / -type f -exec grep -H 'text-to-find-here' \;
它将搜索所有文件系统,因为/
是根文件夹。
用于主文件夹:
find ~/ -type f -exec grep -H 'text-to-find-here' \;
当前文件夹使用:
find ./ -type f -exec grep -H 'text-to-find-here' \;
【讨论】:
也许文件夹差异的细节对许多人来说是显而易见的......但对新手也很有帮助。 +1 这是对现有答案的补充? 称它为我的十字军东征,但这个词是“目录”。这不是 Windows(过去一直使用“目录”——9x 之前)。请停止说“文件夹”。至于你的最后一个命令,你甚至不需要'/',仅供参考。【参考方案26】:有一个ack
工具可以完全满足您的需求。
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
对于区分大小写的搜索,您可以忽略 -i
【讨论】:
这是对现有答案的补充?这是三年多前提出的建议。 @fedorqui 1) 没有管道! 2) 使用正则表达式 3) 获取行号、带有相对路径的文件名、突出显示的文本等,对搜索后的编辑很有用,例如“vim +lineno path/file.cpp”会让你在不感兴趣的行上正确。请参阅命令“ack include\|hpp”的输出,该命令在我的搜索文件夹和子文件夹下搜索“include”或“hpp”关键字。我希望这一点很清楚。这是示例输出(不能用简单的文本显示关键字突出显示) process/child.hpp 11:boost/process/child.hpp process/all.hpp 21:#include用途:
grep -c Your_Pattern *
这将报告当前目录中每个文件中有多少个模式副本。
【讨论】:
【参考方案28】:grep "text-to-find-here" file_name
或
grep "text-to-find-here" directory_path/*
如果要搜索当前目录:
grep "text-to-find-here" *
【讨论】:
如果您要递归查看子目录,请确保在grep
之后添加-r
开关。【参考方案29】:
要搜索字符串并仅输出带有搜索字符串的那一行:
for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done
例如:
for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
显示包含搜索字符串的文件名:
for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
例如:
for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
【讨论】:
与使用find … -exec grep 'str' \;
相比,我只看到了缺点(如果你必须使用 find
的话)。
如果find
找到的任何文件包含空格,这将非常糟糕。您最终可能会发现grepping
错误的文件和/或完全丢失正确的文件。如果您需要使用find
,只需使用find ... -exec grep ...
.. 但在这种情况下grep -r ...
就足够了。
对 find 的结果使用循环然后 grep 的意义何在?这变得不必要地复杂了。【参考方案30】:
所有以前的答案都建议使用 grep 和 find。但还有另一种方式:使用Midnight Commander
它是一个免费的实用程序(30 年的历史,已被时间证明),它是可视的,而不是 GUI。它有很多功能,查找文件只是其中之一。
【讨论】:
游侠的想法是一样的以上是关于如何在 Linux 上找到包含特定文本的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章