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

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

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

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

使用grep -ilR

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

执行以下操作:

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/search/' -e "pattern"

这对我来说非常有效,几乎达到了和你一样的目的。

有关更多选项,请参阅#0

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

只要做到:

ack 'text-to-find-here'

在您的根目录中。

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


更新

我刚刚发现了银色搜寻者,它类似于ack,但比它快3-5倍,甚至忽略了.gitignore文件中的模式。

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

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.pombash-4.1$

消除大小写敏感性

即使您不使用“text”和“TEXT”等大小写,您也可以使用-i开关来忽略大小写。您可以阅读更多详细信息这里

希望这对你有帮助。

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

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

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

要搜索字符串并仅输出包含搜索字符串的该行:

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;

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

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

您可以使用:

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

只是奔跑,

grep -RIl "" .

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

如果您的grep不支持递归搜索,您可以将findxargs组合:

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

我发现这比find -exec的格式更容易记住。

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

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

您可能想要添加到grep的可选标志:

  • -i-不区分大小写的搜索
  • -l-只输出找到匹配的文件名
  • -h-只输出匹配的行(不是文件名)
find /path -type f -exec grep -l "string" {} \;

评论的解释

查找是一个命令,可让您在给定路径的子目录中查找文件和其他对象,例如目录和链接。如果您没有指定文件名应满足的掩码,它会枚举所有目录对象。

-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

尝试:

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

试试这个:

find . | xargs grep 'word' -sl

如果您有一组您将始终检查的文件,您可以为它们的路径别名,例如:

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

然后你可以像这样简单地过滤列表:

grep -U -l $'\015' $(fd)

它将列表fd过滤到包含CR模式的文件中。

我发现我感兴趣的文件的混淆现象有助于我创建更简单的脚本,然后总是试图记住如何获取所有这些文件。递归的东西也可以工作,但迟早你将不得不与淘汰特定的文件类型作斗争。这就是为什么我一开始就找到我感兴趣的所有文件类型。

希望这是帮助…

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"

对选项的简短解释:

  1. find中的.指定来自当前目录。
  2. -name"*.*":所有文件(-name"*.pas"-o-name"*.dfm"):仅*.pas OR*.dfm文件,OR用-o
  3. 指定
  4. -type f指定您正在查找文件
  5. |(管道)另一侧的-print0--null是至关重要的,将文件名从find传递到嵌入在xargs中的grep,允许文件名中带有空格的文件名传递,允许grep将路径和文件名视为一个字符串,而不是在每个空格上拆分它。

尝试:

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

#0GNUBSD

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

grep -r "class foo" .

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

您还可以使用全局语法在特定文件中搜索,例如:

grep "class foo" **/*.c

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

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

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

或者,使用#0

ripgrep

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

rg "class foo" .

在GitHub项目页面上查看文档、安装步骤或源代码

它比任何其他工具(如GNU/BSD#0#1ucg0、ucg1、ucg2、ucg3或类似工具)都要快得多,因为它是建立在ucg4之上的,它使用有限自动机、SIMD和积极的文字优化来使搜索速度非常快。

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


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

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

您可以使用以下命令,因为您不想要文件名,但要从所有文件中搜索。这里是我正在捕获“文本”表单所有日志文件确保文件名未打印

grep -e TEXT *.log | cut -d' ' --complement -s -f1

与其他选项相比,带有-e选项的grep非常快,因为它用于PATTERN匹配

试试这个

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;

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

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

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


如果在您的示例中使用查找,最好将-s--no-messages)添加到grep,并在命令末尾添加2>/dev/null,以避免grepfind发出大量请求被拒绝消息:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

查找是在类Unix平台上搜索文件的标准工具-在查找特定文本时结合grep。顺便说一句,找到命令通常与xargs结合使用。

更快更简单的工具也有相同的目的-见下文。最好尝试一下,只要它们在您的平台上可用,当然:

更快更简单的替代品

RipGrep-最快的搜索工具:

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

银色搜寻者

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

ack

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

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


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

下面的命令将适用于这种方法:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
grep -insr "pattern" *
  • i:忽略模式和输入文件中的大小写区别。
  • n:在输入文件中用从1开始的行号作为输出的每一行的前缀。
  • s:禁止有关不存在或不可读文件的错误消息。
  • r:递归读取每个目录下的所有文件。

避免麻烦并安装ack-grep。它消除了许多权限和报价问题。

apt-get install ack-grep

然后转到要搜索的目录并运行以下命令

cd /ack-grep "find my keyword"

使用pwd从您所在的任何目录中搜索,向下递归

grep -rnw `pwd` -e "pattern"

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

因此:

grep -rnw -e "pattern"

grep -rnw "pattern"

会像上面一样做同样的事情!

ack工具可以做你正在寻找的事情:

ack -i search_string folder_path/*

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

用途:

grep -Erni + "text you wanna search"

该命令将在当前目录的所有文件和目录中递归搜索并打印结果。

注意:如果您的grep输出没有着色,您可以通过在shell源文件中使用grep='grep--颜色=始终'别名来更改它。

试试这个:

find / -type f -name "*" -exec grep -il "String_to_search" {} \;

for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null

有一个名为银色探索者的新实用程序

sudo apt install silversearcher-ag

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

您可以简单地使用

ag "Search query"

它会为你完成任务!

Silver Searcher是一个很棒的工具,但Ripgrep可能更好。

它适用于Linux,Mac和Windows,并在几个月前写在黑客新闻上(这有一个链接到Andrew Gallant的博客,其中有一个GitHub链接):

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

用途:

grep -c Your_Pattern *

这将报告当前目录中的每个文件中有多少个模式副本。

您可以使用以下命令从文件中查找特定文本:

cat file | grep 'abc' | cut -d':' -f2

一个简单的find可以很方便地工作。别名它在你的~/.bashrc文件:

alias ffind find / -type f | xargs grep

启动一个新终端并发出:

ffind 'text-to-find-here'

前面的所有答案都建议使用grep和find。但还有另一种方法:使用午夜指挥官

它是一个免费的实用程序(30岁,经过时间的证明),无需GUI即可可视化。它有很多功能,查找文件只是其中之一。

彼得在前面的回答中提到所示,所有先前的答案都建议使用grep和查找。

但是有一种更复杂的方法使用侏儒指挥官和完美的GUI以及自2001年以来的大量选项,查找文件只是其中之一。它也是一个免费的实用程序,经过时间的证明。

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

使用'-r'不带'l'来查看后跟在其中找到模式的文本的文件名!

grep -r 'pattern_to_find' /path/where/to/find

它工作得很完美…

grep是你实现这一目标的好朋友。

grep -r <text_fo_find> <directory>

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

grep -ir <text_to_find> <directory>

当有许多潜在的匹配项需要筛选时,首选findxarg。它比其他选项运行得慢,但它总是有效的。正如一些人发现的那样,xargs默认情况下不处理嵌入空格的文件。您可以通过指定-d选项来克服这一点。

这是@RobEarl的答案,经过增强,它可以处理带空格的文件:

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

这是@venkat的回答,同样增强:

find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"

以下是@Gert van Biljon的回答,同样增强了:

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

这是@LetalProgrammer的回答,类似地增强了:

alias ffind find / -type f | xargs -d '\n' grep

以下是@Tayab Hussain的回答,同样增强:

find . | xargs -d '\n' grep 'word' -sl

GUI搜索替代-桌面使用:

-因为问题并不是要求命令

搜索猴:无需使用正则表达式索引系统的高级文件搜索工具。图形等效于查找/grep。可用于Linux(Gnome/KDE/Java)和Windows(Java)-开源GPL v3

产品特点:

  • 高级正则表达式
  • 上下文中显示的结果
  • 搜索包含文本
  • 显示包含文本的行的面板
  • 新的2018更新

下载-链接:

.

截图:

在此输入图片描述

另请参阅铂金探索者,它类似于银色搜寻者,是用Go编写的。

示例:

pt -e 'text to search'

如果你想使用find,那么使用find + grep

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

步骤

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

这为您提供了find查找文件的功能。

  • 如果您只想grep某些文件,请使用-name Pattern

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

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

您的命令是正确的。您只需要将-l添加到grep:

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

我试图找到一种方法扫描我整个Linux系统的所有文件包含一个特定的字符串的文本…这是接近正确的方式做到这一点?如果不是,我应该怎么做?…这种在文件中查找文本字符串的能力将是非常有用的一些编程项目我正在做。

虽然你不应该用不同的程序替换(或别名)系统命令,但由于脚本或其他实用程序的神秘破坏的风险,如果你正在手动或从你自己的脚本或程序运行文本搜索,你应该考虑在多次搜索大量文件时最快的合适程序。安装和熟悉更好实用程序所花费的十分钟到半小时的时间可以在对你描述的用例进行几次使用后恢复。

提供“ack、ag、git-grep、GNU grep和ripgrep的功能比较”的网页可以帮助您决定哪个程序提供您需要的功能。

  • Andrew Gallant的博客声称:“ripgrep比{grep, ag, git grep, ucg, pt, sift}快”(其他人共享的说法,这就是为什么功能比较很有帮助)。特别感兴趣的是他关于regex实现和陷阱的部分。

    以下命令搜索所有文件,包括隐藏和可执行文件:

    $ rg -uuu foobar

  • 银色搜寻者(ag)声称它比Ack快5-10倍。这个程序在其他一些答案中被建议。GitHub看起来不像ripgrep那么新,并且有明显更多的提交和分支,发布更少,很难根据这些统计数据得出绝对的说法。短版本:ripgrep更快,但是有一个很小的学习曲线,不会被差异所吸引。

  • 那么接下来会发生什么,你猜对了,铂金搜索器。声称是:它搜索代码的速度比ack快3-5倍,但它的速度与银色搜索者相当。它用GoLang编写,搜索UTF-8、EUC-JP和Shift_JIS文件;如果这更感兴趣的话。GitHub既不是特别新,也不是特别活跃。GoLang本身有一个快速健壮的正则表达式,但是如果它有更好的用户兴趣,白金搜索器会更好地推荐。

对于速度和功率的组合,弹性搜索Solr等索引查询语言可以是长期的有回报的投资,但如果您想要快速简单地替换grep,则不是。OTOH都有一个可以从您编写的任何程序调用的API,为您的程序添加强大的搜索功能。

虽然可以生成外部程序、执行搜索、拦截其输出并对其进行处理,但调用API是提高功能和性能的方法。

This question was protected Aug 6 '15 at 19:34 with this caution:
  我们正在寻找能够提供一些解释和背景的长答案。不要只是给出一行答案;解释为什么你的答案是对的,最好有引用。

虽然有些答案提出了完成搜索的替代方法,但除了“免费”、“更快”、“更复杂”、“大量功能”等之外,他们没有解释为什么。不要试图推销它,只要告诉我们“为什么你的答案是对的”。我试图教如何选择最适合用户的东西,为什么。这就是为什么当已经有这么多答案时,我再提供另一个答案。否则,我同意已经有很多答案了;我希望我带来了很多新的东西。

您也可以使用awk

awk '/^(pattern)/{print}' /path/to/find/*

pattern是您要在文件中匹配的字符串。

grep -lrnw '/root/Desktop/ipozal' -e 'geolocation'

例如:

  • 我的文件夹名称是“ipozal
  • 它被放置在“/root/Desktop”上
  • 我想在其中的所有文件中找到此文本“地理定位

我尝试了下面的grep命令。它有助于在/etc/yum.repos.d的存储库中搜索内容。

grep -Ril -e 'texttoSearch' /etc/yum.repos.d

试试这个命令。它会给你包含你输入的模式的文件。

sudo grep -inr "your-pattern" /

这里:i-忽略大小写区别,以便仅在大小写上不同的字符相互匹配。

n-确保实际行内容的第一个字符位于制表符上,以便制表符的对齐看起来正常。

r-递归读取每个目录下的所有文件,仅当它们位于命令行上时才遵循符号链接。请注意,如果没有给出文件操作数,grep会搜索工作目录。

您可以使用Ripgrep,它将尊重默认项目的.gitignore文件。

ripgrep

要抑制请求被拒绝错误:

rg -i rustacean 2> /dev/null

这将标准误差(stderr)输出重定向到/dev/null

请根据需求自定义以下命令,并从文件中递归查找任何字符串。

grep -i hack $(find /etc/ -type f)

如果您在Git存储库中,您可以使用:

git grep something

我的用例是找到我以前编写的以特定方式编写jsonline的Python代码。我知道jsonl将成为函数名称的一部分,to_json将出现在主体中,但没有太多其他内容。

尽管有50个答案,但在同一个文件中找到多个字符串(无论是否在同一行)都没有得到回答。

grep中的-q是安静的。没有打印任何内容,只有设置返回值。因此,末尾的-print。每个-exec只有在前一个成功时才会运行。因此,如果您有很多文件,考虑将消除您不感兴趣的文件的模式是值得的。

find . -type f -name "*.py" \-exec grep -q -e 'to_json' {} \; \-exec grep -q -e 'def\s.*jsonl' {} \; \-print
grep "text-to-find-here" file_name

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

如果要搜索当前目录:

grep "text-to-find-here" *

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

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

  • i代表忽略区分

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

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

  • s代表“抑制错误消息”

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