如何在 Linux 上找到包含特定文本(字符串)的所有文件?

How can I find all files containing a specific text (string) on Linux?

提问人:Nathan 提问时间:6/6/2013 最后编辑:Peter MortensenNathan 更新时间:11/11/2023 访问量:10636999

问:

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

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

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

find / -type f -exec grep -H 'text-to-find-here' {} \;
linux 文本 grep 目录 查找

评论

41赞 Walter Tross 10/28/2013
请记住,grep 会将 any 解释为单字符通配符等。我的建议是始终使用 fgrep 或 egrep。.
14赞 Walter Tross 10/28/2013
无论如何,你快到了!只需替换为 (也许用 )。若要排除具有某些名称模式的文件,请以更高级的方式使用。不过,学习使用是值得的。只。-H-lgrepfgrepfindfindman find
11赞 hagello 1/28/2016
find … -exec <cmd> +比 更易于键入且速度更快。仅当接受任意数量的文件名参数时,它才有效。如果像 Python 或 Ruby 脚本那样启动缓慢,则执行时间的节省尤其大。find … -exec <cmd> \;<cmd><cmd>
0赞 NAND 5/20/2020
这回答了你的问题吗?如何使用 grep 在文件夹中查找单词?
0赞 Ubuntourist 9/24/2023
为什么这没有得到“这个问题与编程或软件开发无关。它目前不接受答案。 当我关于排序的问题发生时?

答:

2264赞 fedorqui 6/6/2013 #1

用:grep -ilR

grep -Ril "text-to-find-here" /
  • i代表忽略大小写(在您的案例中是可选的)。
  • R代表递归。
  • l代表“显示文件名,而不是结果本身”。
  • /代表从机器的根部开始。

评论

143赞 fedorqui 6/6/2013
根据我的经验,这会使它变慢很多,所以如果没有必要,请不要使用它。在某个目录中测试它,然后进行推广。它应该在几分钟内完成。我认为正则表达式会使它变慢。但我的评论是基于假设的,我建议你在线前测试一下。-itime
34赞 Black 1/28/2016
您可以将 / 替换为目录的路径或使用 .对于当前目录grep -Ril "text-to-find-here" ~/sites/grep -Ril "text-to-find-here" .
0赞 raaj 10/11/2021
虽然很慢。不建议用于大型文件系统。
0赞 JDuarteDJ 2/8/2023
在我的发行版上,grep 使用小写字母“R”,所以它是 => ,但大写字母 R 不起作用。grep -ril "name" /
13432赞 rakib_ 6/6/2013 #2

执行以下操作:

grep -Rnw '/path/to/somewhere/' -e 'pattern'
  • -r或者是递归的 ;用于完全搜索-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"
    
  • 对于目录,可以使用该参数排除一个或多个目录。例如,这将排除 dirs ,并且所有目录都匹配:--exclude-dirdir1/dir2/*.dst/

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/search/' -e "pattern"
    

这对我来说非常有效,可以达到与您几乎相同的目的。

有关更多选项,请参阅 man grep

评论

94赞 rakib_ 6/6/2013
使用 --exclude。比如 “grep -rnw --exclude=*.o 'directory' -e ”pattern”
181赞 Eliran Malka 3/24/2015
值得注意的是:该选项似乎是懒惰的(首先遍历深度,而不是在第一个目录之后停止),而贪婪(将正确遍历整个树)。rR
59赞 madD7 12/22/2015
注意(特别是对于新手):上面命令中的引号很重要。
3赞 Ivan Gorin 11/20/2022
对我来说,添加跳过所有二进制文件的选项很有用。-I
0赞 MikeOnline 11/15/2023
-rnw区分大小写,且仅是整个单词。对于更广泛的搜索,更改为为生成整个或部分单词的匹配项,而不考虑字母大小写。-rnw-rni
461赞 Stephan 6/6/2013 #3

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

只要做:

ack 'text-to-find-here'

在根目录中。

您还可以使用正则表达式、指定文件类型等。


更新

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

评论

75赞 Jose_GD 9/20/2013
非常有用,简单快捷。警告:“在 Debian 衍生的发行版上,ack 被打包为”ack-grep“,因为”ack“已经存在”(来自 beyondgrep.com/install)。您最终可能会在这些 Linux 上运行汉字代码转换器......
12赞 Sławomir Lenart 2/11/2015
ack 或 ack-grep 有很好的亮点,但 find+grep 如果使用得当,性能要好得多
36赞 Resigned June 2023 10/14/2017
请注意,ripgrep 比这里提到的任何其他东西都快,包括 The Silver Searcher 和普通的 'ol grep。请参阅这篇博文作为证明。
0赞 Russo 2/22/2023
在 Ubuntu 和 LinuxMint 上,使用 $ag 'what I want' ./
166赞 A R 7/31/2013 #4

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

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

评论

0赞 albanx 2/24/2016
如果添加 -A3 会更好
0赞 Udesh 2/23/2022
-i 表示不区分大小写,-n 显示行号,-r 递归读取子目录中的所有文件
122赞 lkamal 11/9/2013 #5

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

首先,我相信你已经用了 .您也可以尝试在引号内添加文本,后跟 .-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

评论

2赞 Mene 4/20/2017
这就是此命令的作用:将它找到的所有路径传递给命令。您可以对文件名添加限制,例如 仅在名称以findgrep -l "text-to-find-here" <file found>"find / -iname "*.txt".txt
1赞 lkamal 10/7/2017
@Auxiliary - 包括一个示例输出,以避免读者产生任何混淆。
3赞 Pryftan 5/2/2018
@Mene Auxiliary 的评论比你的评论多,这真是一个可悲的状态......即使他们的评论是 2014 年的,而你的评论是 2017 年的,他们的评论有 6 个,而它应该正好是 0,而你的评论只有一个(现在是两个),我不愿意相信。
0赞 Pryftan 5/2/2018
@Mene 话虽如此,-iname 不区分大小写,这意味着它还可以找到.TXT文件,例如,以及 TxT 和 TXt 等。
17赞 Dilawar 1/6/2014 #6

我写了一个 Python 脚本来做类似的事情。这就是应该如何使用这个脚本。

./sniff.py path pattern_to_search [file_pattern]

第一个参数 是我们将在其中递归搜索的目录。第二个参数 是我们想要在文件中搜索的正则表达式。我们使用 Python 库中定义的正则表达式格式。在此脚本中,还匹配换行符。pathpattern_to_searchre.

第三个参数 是可选的。这是另一个适用于文件名的正则表达式。只有与此正则表达式匹配的文件才会被考虑。file_pattern

例如,如果我想搜索扩展名后跟 word 的 Python 文件,我执行以下操作,pyPool(Adaptor

./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 

瞧,它会生成匹配文件的路径和找到匹配项的行号。如果找到多个匹配项,则每个行号都将附加到文件名中。

17赞 user3124504 1/25/2014 #7

要搜索字符串并仅输出带有搜索字符串的那一行,请执行以下操作:

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;

评论

2赞 phk 10/8/2016
与使用相比,我只看到缺点(如果您必须使用的话)。find … -exec grep 'str' {} \;find
2赞 shalomb 10/12/2016
如果包含空格找到的任何文件,这将严重破坏。您最终可能会得到错误的文件和/或完全丢失正确的文件。如果您需要使用...,请使用。但在这种情况下,A 就足够了。findgreppingfind ... -exec grep ...findgrep -r ...
2赞 fedorqui 12/2/2016
对 find 的结果使用循环到然后 grep 有什么意义?这变得不必要地复杂。
23赞 Atul Arvind 2/1/2014 #8

以下是可用于搜索文件的几个命令列表。

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

评论

6赞 fedorqui 12/2/2016
这对现有答案有什么好处?
0赞 omerhakanbilici 7/25/2018
@fedorqui 等同于,这意味着您可以在此处找到详细信息 unix.stackexchange.com/a/17951/196072egrepgrep -E--extended-regexp
291赞 learner_19 3/15/2014 #9

您可以使用:

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: line number will be shown for matches

评论

5赞 mightypile 8/16/2017
感谢您的“查找”版本!能够按“.js”或“.txt”等进行过滤非常重要。没有人愿意花几个小时等待 grep 完成搜索上次家庭度假的所有 GB 视频,即使该命令更容易输入。
26赞 Alex Jasmin 4/10/2014 #10

grep即使我们不是在寻找字符串,也可以使用。

简单的运行,

grep -RIl "" .

将打印出所有文本文件的路径,即仅包含可打印字符的文件。

评论

2赞 fedorqui 12/2/2016
我看不出这比使用单纯的或(对于递归的)更好lsfind
71赞 RobEarl 6/20/2014 #11

如果您不支持递归搜索,您可以结合:grepfindxargs

find / -type f | xargs grep 'text-to-find-here'

我发现这比 .find -exec

这将输出文件名和匹配行的内容,例如

/home/rob/file:text-to-find-here

您可能希望添加到的可选标志:grep

  • -i- 不区分大小写的搜索
  • -l- 仅输出找到匹配项的文件名
  • -h- 只输出匹配的行(不是文件名)

评论

4赞 hagello 1/28/2016
如果找不到任何内容,这相当于没有文件名。这将挂起并等待用户输入!作为选项添加到 。grep 'text-to-find-here'find--no-run-if-emptyxargs
4赞 hagello 1/28/2016
如果文件或目录名称包含空格(xargs 解释为分隔符的字符),则 find 和 xargs 的这种组合无法按预期工作。用。如果您坚持将 find 与 xargs 一起使用,请使用 和 。find … -exec grep … +-print0-0
19赞 Vinod Joshi 7/2/2014 #12
find /path -type f -exec grep -l "string" {} \;

评论中的解释

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
38赞 venkat 12/10/2014 #13

尝试:

find . -name "*.txt" | xargs grep -i "text_pattern"

评论

5赞 shalomb 10/12/2016
这实际上是一个典型的例子,说明什么时候不要这样使用......考虑一下。 .此处匹配了错误的文件,并且与预期的文件不匹配。要么使用管道,但这是无用的管道使用,或者更好xargsecho "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 fooxargsfind .. -print0 | xargs -0 ...find ... -exec grep ... {} +
21赞 Gert van Biljon 1/28/2015 #14

扩展 a 位以在输出中提供更多信息,例如,获取文本所在的文件中的行号,可以按如下方式完成:grep

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

如果您知道文件类型是什么,您可以通过指定要搜索的文件类型扩展名来缩小搜索范围,在本例中为 OR 文件:.pas.dfm

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

选项的简短说明:

  1. .在指定当前目录中。find
  2. -name "*.*“ :对于所有文件 ( -name “” -o -name “” ) : 仅 OR 文件,OR 指定*.pas*.dfm*.pas*.dfm-o
  3. -type f指定要查找的文件
  4. -print0在(管道)的另一边是关键的,将文件名从 传递到 嵌入在 中,允许在文件名中传递带有空格的文件名,允许 grep 将路径和文件名视为一个字符串,而不是在每个空格上将其分解。--null|findgrepxargs

评论

0赞 Pryftan 5/2/2018
-name '*.*'不是你说的;它不会接收名为“file”的文件,因为该模式不等同于该文件(没有 .ext); 然而,会(好吧,文件放在一边)。但还有另一件事:如果你想要所有文件,为什么首先要指定一个文件名呢?没有其他评论 - 除了很高兴知道仍然有人不使用 MS 术语“文件夹”(真的,在说得够多之后,我不会添加,但我想指出你对文件名所做的稍微不正确的陈述 - 以及“全部”情况下的冗余/无用)。*
0赞 Peter Mortensen 10/5/2023
print0也应该解释。是文件名中的空格吗?
18赞 user4863663 5/5/2015 #15

尝试:

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' {} \;

评论

0赞 nilon 10/18/2016
也许文件夹差异的细节对许多人来说是显而易见的......但对新手也很有帮助。+1
1赞 fedorqui 12/2/2016
这对现有答案有什么好处?
0赞 Pryftan 5/2/2018
称它为我的十字军东征,但这个词是“目录”。这不是 Windows(无论如何都使用“目录” - 9x 之前)。请停止说“文件夹”。至于你的最后一个命令,你甚至不需要“/”,仅供参考。
135赞 kenorb 5/9/2015 #16

grepGNUBSD)

您可以使用工具递归搜索当前文件夹,例如: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 grepucgagsiftackpt 或类似工具)都要快得多,因为它是建立在 Rust 的正则表达式引擎之上的,该引擎使用有限自动机、SIMD 和激进的文字优化来使搜索非常快。

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


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

  • -i- 不敏感的搜索。
  • -I- 忽略二进制文件。
  • -w- 搜索整个单词(与部分单词匹配相反)。
  • -n- 显示您的匹配线。
  • -C/--context(例如) - 增加上下文,以便您看到周围的代码。-C5
  • --color=auto- 标记匹配的文本。
  • -H- 显示找到文本的文件名。
  • -c- 显示匹配行数。可以与 . 结合使用-H

评论

2赞 Yoory N. 11/30/2017
我还发现扩展通配很有用。但请记住,如果文件数量非常多,您可能会收到“参数列表太长”错误。(简单通配也容易出现这种错误)。
51赞 Bludzee 11/25/2015 #17

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

我两次遇到这个解决方案:

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


如果像在示例中使用 find 一样,最好在命令末尾添加 () 和 ,以避免 和 发出大量 Permission denied 消息:-s--no-messagesgrep2>/dev/nullgrepfind

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

白银搜索者

ag 'text-to-find-here' / -l

确认

ack 'text-to-find-here' / -l

注意:您也可以添加到这些命令中,以隐藏许多错误消息。2>/dev/null


警告除非你真的无法避免它,否则不要从“/”(根目录)搜索,以避免长时间和低效的搜索! 因此,在上面的示例中,您最好将“/”替换为子目录名称,例如“/home”,具体取决于您实际要搜索的位置......

54赞 enfinet 2/26/2016 #18
grep -insr "pattern" *
  • i:忽略 PATTERN 和输入文件中的大小写区别。
  • n:在每行输出前加上其输入文件中从 1 开始的行号。
  • s:禁止显示有关不存在或不可读文件的错误消息。
  • r:以递归方式读取每个目录下的所有文件。

评论

3赞 Amos M. Carpenter 2/26/2016
你能解释一下你的答案是如何改进其他答案的,或者它与它们有什么不同吗?
0赞 enfinet 2/26/2016
记住起来并不复杂,将涵盖所有模式(区分大小写 ->关闭,包括文件名和行号,并将进行递归搜索等),最后使用“*”将搜索所有目录(无需指定任何路径或目录名称)。
0赞 Amos M. Carpenter 2/26/2016
对不起,我应该说得更清楚:如果你能在你的答案中包括这个解释,那就太好了。就目前而言,尤其是已经有这么多其他类似的答案,很难从如此简短的答案中看出尝试比公认的答案或被点赞的答案之一有什么好处。
7赞 leetNightshade 2/20/2017
@AmosM.Carpenter:我喜欢这个答案的一件事是指出抑制参数,它可以帮助过滤掉与获得我们真正想要的结果无关紧要的噪音。Grep 在某些“文件”上打印错误,例如“函数未实现”、“参数无效”、“资源不可用”等。
0赞 Amos M. Carpenter 2/20/2017
@leetNightshade:我假设你是在向我发表评论,因为我要求对稀疏的原始帖子进行解释。请参阅 Fabio 对我之前的评论的重大修订,以使其有意义。
49赞 mahatmanich 5/28/2016 #19

用于从您所在的任何目录进行搜索,向下递归pwd

grep -rnw `pwd` -e "pattern"

根据您使用的 grep 版本,您可以省略 .在较新的版本中,如果没有给出目录,这似乎是 grep 的默认情况。pwd.

因此:

grep -rnw -e "pattern"

grep -rnw "pattern"

会做和上面一样的事情!

评论

6赞 fedorqui 12/2/2016
根本不需要使用,因为它是默认设置。 够。pwdgrep -rnw "pattern"
0赞 fedorqui 12/2/2016
事实上,三年前的答案是相似的,我看不出这个答案是如何增加价值的。grep -rnw
0赞 mahatmanich 12/14/2016
所选答案未显示默认模式,5 人似乎发现它很有用
0赞 fedorqui 12/14/2016
“默认模式”是什么意思?公认的答案包含您在这里所拥有的。5M访问后2.3票并不意味着那么多。grep -rnw '/path/to/somewhere/' -e "pattern"
0赞 mahatmanich 12/14/2016
我同意:-)我在原始答案中缺少的是您根本不需要给出路径或递归搜索当前目录的用例,这未反映在接受的答案中。因此,这是一次关于 grep 的很好的学习体验,可以更深入地挖掘。
23赞 Pal 8/17/2016 #20

有一个 ack 工具可以完全满足您的需求:

ack -i search_string folder_path/*

对于区分大小写的搜索,您可以忽略。-i

评论

2赞 fedorqui 12/2/2016
这对现有答案有什么好处?这在三年多前就已经提出来了。
2赞 Pal 7/11/2017
@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 < boost/process/execute.hpp>
55赞 Neil Agarwal 11/4/2016 #21

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

sudo apt install silversearcher-ag

它与 Git 和其他 VCS 密切合作。因此,您不会在 .git 或其他目录中获得任何内容。

您可以简单地使用

ag "Search query"

它会为您完成任务!

评论

1赞 joe_evans 7/6/2020
好电话!.我下载了它并第一次使用它。输出结果信息量很大,丰富多彩,非常有帮助。这个程序将永远留在我的机器中。我还把它放在了我的“安装新计算机”程序列表中。干杯!!
25赞 AAAfarmclub 12/13/2016 #22

Silver Searcher 是一个了不起的工具,但 ripgrep 可能更好。

它适用于 Linux、Mac 和 Windows,几个月前在 Hacker News 上写了这篇文章(这有一个指向 Andrew Gallant 博客的链接,该博客有一个 GitHub 链接):

Ripgrep – 一个新的命令行搜索工具

20赞 danglingpointer 3/22/2017 #23

一个简单的可以派上用场。在文件中别名:find~/.bashrc

alias ffind find / -type f | xargs grep

启动新终端并发出:

ffind 'text-to-find-here'
21赞 nitinr708 8/8/2017 #24

我着迷于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

它工作得很完美......

评论

0赞 Peter Mortensen 4/24/2019
这也适用于 Git Bash (Windows)。
0赞 Peter Mortensen 4/25/2019
但这意味着必须搜索每个文件(没有对文件名或文件扩展名级别进行筛选,例如 )。或者有没有办法做到这一点?.txt
18赞 Prash 10/24/2017 #25

Grep 是您实现这一目标的好朋友。

grep -r <text_fo_find> <directory>

如果您不关心要查找的文本的大小写,请使用:

grep -ir <text_to_find> <directory>

评论

0赞 Pathros 3/21/2018
就我而言,即使我指定了目录,它看起来也会到处搜索
0赞 Pryftan 5/2/2018
@Pathros 可能与启用递归和您指定的目录有关。换句话说,递归确实以这种方式改变了事情。
0赞 Pryftan 6/2/2018
@Pathros 哦,如果搜索字符串中有任何 - s,你会想传入 -- 首先 grep;否则会引起有趣的副作用!
25赞 BreakBadSP 6/25/2018 #26

如果你严格想使用,那么使用:findfind + grep

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

步骤

  1. 用于搜索文件,find
  2. 对所有这些执行。grep

这使您能够查找文件。find

  • 如果只想处理某些文件,请使用:-name Patterngrep

find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

您可以使用不同的选项来改进文件搜索。find

评论

0赞 Peter Mortensen 3/27/2020
有何不同?它适用于文件路径中的空格吗?
1赞 Andrey Mikhaylov - lolmaus 12/8/2021
不提供找到的文件的文件名。
36赞 Eyni Kave 12/20/2019 #27
grep -lrnw '/root/Desktop/ipozal' -e 'geolocation'

例如:

  • 我的文件夹名称是“ipozal"
  • 它放置在“/root/Desktop"
  • 我想在它的所有文件上找到这个文本“地理位置"

评论

5赞 jkdev 12/20/2019
欢迎来到 Stack Overflow!请考虑为此代码块添加描述或解释。
0赞 Eyni Kave 12/21/2019
1.在桌面上备份您的文件夹
0赞 Eyni Kave 12/21/2019
2. 我的项目名称是“iPozal”
0赞 Eyni Kave 12/21/2019
然后使用此命令并将“ipozal”替换为您的文件夹名称,以查找包含此文本“geolocation”的文件
1赞 jkdev 12/22/2019
很好的解释 -- 你应该编辑你的答案,以便包括解释。
22赞 Dorian 2/22/2021 #28

如果您位于 Git 存储库中,则可以使用:

git grep something

评论

1赞 Joshua Pinter 2/22/2022
出于好奇,这是否只检查已签入和/或不在文件中的文件?只是检查以确保,因为我喜欢这在目录已经是存储库的大多数开发情况下是多么方便。git.gitignoregit
1赞 Dorian 2/23/2022
@JoshuaPinter为您录制了一个 ASCIICINEMA,asciinema.org/a/g92UTPtL929ysb8umqPj9e2SA 这个想法是 git grep 搜索 git 中的内容,无论是提交的还是隐藏的。当你忽略一个文件并且它没有被提交或隐藏时,它不会出现在 git grep 中
0赞 Joshua Pinter 2/24/2022
@Dorian 太好了。感谢您确认这个想法。如果你没有意识到,这可能是一个令人讨厌的陷阱。再次感谢。
21赞 Michael 6/7/2021 #29
grep "text-to-find-here" file_name

grep "text-to-find-here" directory_path/*

如果要搜索当前目录:

grep "text-to-find-here" *

评论

7赞 Joshua Pinter 6/29/2021
如果您以递归方式查看子目录,请确保在之后添加一个开关。-rgrep
78赞 shashank arora 3/21/2022 #30

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

grep -inRsH "Text to be searched" /path/to/dir (it can be '.')

  • i代表忽略大小写区别

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

  • n代表“它将打印行号”。

  • s代表“禁止错误消息”

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

评论

1赞 FiruzzZ 6/30/2022
但这不会显示包含该文本的“文件”
0赞 shashank arora 6/30/2022
此组合将为您提供 lineno、filename 以及您搜索过的文本。@FiruzzZ尝试一次