我正在尝试找到一种方法来扫描我的整个 Linux 系统以查找包含特定文本字符串的所有文件。澄清一下,我在文件中寻找文本,而不是在文件名中。
当我查找如何执行此操作时,我遇到了两次此解决方案:
find / -type f -exec grep -H 'text-to-find-here' {} \;
但是,它不起作用。它似乎显示了系统中的每个文件。
这接近正确的方法吗?如果没有,我该怎么办?这种在文件中查找文本字符串的能力对于我正在做的一些编程项目非常有用。
请执行下列操作:
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"
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'
在您的根目录中。
您还可以使用正则表达式,指定文件类型等。
更新
我刚刚发现了The Silver Searcher,它类似于 ack 但比它快 3-5 倍,甚至可以忽略.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 "String to search" /path/to/directory/or/file -r: recursive search n: 将显示匹配的行号
你可以使用这个:
grep -inr "Text" folder/to/be/searched/
grep
(GNU或BSD)您可以使用grep
工具递归搜索当前文件夹,例如:
grep -r "class foo" .
注意:-r
- 递归搜索子目录。
您还可以使用通配符语法在特定文件中进行搜索,例如:
grep "class foo" **/*.c
注意:通过使用globbing 选项( **
),它会递归地扫描具有特定扩展名或模式的所有文件。要启用此语法,请运行: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
(eg -C5
) - 增加上下文,所以你可以看到周围的代码。--color=auto
- 标记匹配的文本。-H
- 显示找到文本的文件名。-c
- 显示匹配行数。可以与-H
.首先,我相信你已经使用-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
:递归读取每个目录下的所有文件。有一个名为The Silversearcher的新实用程序
sudo apt install silversearcher-ag
它与 Git 和其他 VCS 密切合作。所以你不会在.git或其他目录中得到任何东西。
你可以简单地使用
ag "Search query"
它会为你完成任务!
如何在 Linux 上找到包含特定文本的所有文件?(...)
我两次遇到这个解决方案:
find / -type f -exec grep -H 'text-to-find-here' {} \;
如果在您的示例中使用find ,最好在命令末尾添加-s
( --no-messages
)grep
和,以避免由and发出大量Permission denied消息:2>/dev/null
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
ag 'text-to-find-here' / -l
确认:
ack 'text-to-find-here' / -l
注意:您也可以添加2>/dev/null
到这些命令中,以隐藏许多错误消息。
警告:除非你真的无法避免,否则不要从“/”(根目录)搜索,以免搜索时间长且效率低!所以在上面的例子中,你最好用一个子目录名称替换' / ',例如“/home”,这取决于你实际想要搜索的位置......
尝试:
find . -name "*.txt" | xargs grep -i "text_pattern"
用于pwd
从您所在的任何目录中搜索,向下递归
grep -rnw `pwd` -e "pattern"
更新
根据您使用的 grep 版本,您可以省略pwd
. 如果没有给出目录,则在较新版本上.
似乎是 grep 的默认情况:
grep -rnw -e "pattern"
或者
grep -rnw "pattern"
会做和上面一样的事情!
grep -lrnw '/root/Desktop/ipozal' -e 'geolocation'
例如:
grep
即使我们不寻找字符串也可以使用。
简单的跑步,
grep -RIl "" .
将打印出所有文本文件的路径,即那些只包含可打印字符的文件。
如果您严格要使用,请find
使用find + grep
:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
步骤:
find
搜索文件,grep
对所有这些执行。这使您find
能够查找文件。
-name Pattern
如果您只想访问grep
某些文件,请使用:find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
您可以使用不同的选项find
来改进文件搜索。
Silver Searcher 是一个了不起的工具,但 ripgrep 可能会更好。
它适用于 Linux、Mac 和 Windows,几个月前在Hacker News上发表了文章(这里有一个 Andrew Gallant 博客的链接,其中有一个 GitHub 链接):
以下是可用于搜索文件的几个命令列表。
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使用 '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
它工作得非常完美......
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
希望这对您有帮助...
扩展grep
a 位以在输出中提供更多信息,例如,获取文本所在文件中的行号,可以按如下方式完成:
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
如果您知道文件类型是什么,您可以通过指定要搜索的文件类型扩展名来缩小搜索范围,在本例中为.pas
OR.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
在|
(pipe) 的另一侧是关键的,将文件名从 传递find
到grep
嵌入的 中xargs
,允许在文件名中传递带有空格的文件名,允许 grep 将路径和文件名视为一个字符串,而不是在每个空间上分解它。一个简单的find
可以得心应手。~/.bashrc
在你的文件中给它起别名:
alias ffind find / -type f | xargs grep
启动一个新终端并发出:
ffind 'text-to-find-here'
grep是您实现这一目标的好朋友。
grep -r <text_fo_find> <directory>
如果您不关心要查找的文本的大小写,请使用:
grep -ir <text_to_find> <directory>
我写了一个Python 脚本,它做了类似的事情。这就是人们应该如何使用这个脚本。
./sniff.py path pattern_to_search [file_pattern]
第一个参数path
是我们将在其中递归搜索的目录。第二个参数pattern_to_search
是我们要在文件中搜索的正则表达式。我们使用Python re
库中定义的正则表达式格式。在此脚本中,.
也匹配换行符。
第三个参数file_pattern
, 是可选的。这是另一个适用于文件名的正则表达式。只有那些匹配这个正则表达式的文件才会被考虑。
例如,如果我想搜索扩展名py
包含Pool(
后跟 word的 Python 文件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
瞧,它会生成匹配文件的路径和找到匹配项的行号。如果找到多个匹配项,则每个行号都将附加到文件名中。
尝试:
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' {} \;
有一个ack
工具可以完全满足您的需求。
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
您可以忽略-i
区分大小写的搜索
grep "text-to-find-here" file_name
或者
grep "text-to-find-here" directory_path/*
如果要搜索当前目录:
grep "text-to-find-here" *
采用:
grep -c Your_Pattern *
这将报告当前目录中的每个文件中有多少个模式副本。
要搜索字符串并仅使用搜索字符串输出该行:
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 ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
以前的所有答案都建议使用 grep 和 find。但还有另一种方法:使用午夜指挥官
它是一个免费的实用程序(已有 30 年历史,已被时间证明),它是可视的,而不是 GUI。它有很多功能,查找文件只是其中之一。
您可以使用以下命令,因为您不需要文件名,但您想从所有文件中搜索。这是我正在捕获“TEXT”表单所有日志文件,确保未打印文件名
grep -e TEXT *.log | cut -d' ' --complement -s -f1
与其他选项相比,带有 -e 选项的 grep 非常快,因为它用于 PATTERN 匹配
试试这个:
find . | xargs grep 'word' -sl
避免麻烦并安装 ack-grep。它消除了许多许可和报价问题。
apt-get install ack-grep
然后进入你要搜索的目录,运行下面的命令
cd /
ack-grep "find my keyword"
我尝试了grep
下面的命令。它有助于在我的存储库中搜索内容/etc/yum.repos.d
。
grep -Ril -e 'texttoSearch' /etc/yum.repos.d
试试这个:
find / -type f -name "*" -exec grep -il "String_to_search" {} \;
或者
for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
采用:
grep -Erni + "text you wanna search"
该命令将在当前目录的所有文件和目录中递归搜索并打印结果。
注意:如果您的 grep 输出没有着色,您可以使用 shell 源文件中的 grep='grep --color=always' 别名来更改它。
find
xarg
当有许多潜在的匹配项需要筛选时,最好使用 with s。它比其他选项运行得更慢,但它总是有效。正如一些人发现的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
如果您在 Git 存储库中,则可以使用:
git grep something
如果您有一组您将始终检查的文件,您可以为它们的路径设置别名,例如:
alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'
然后您可以像这样简单地过滤列表:
grep -U -l $'\015' $(fd)
它将列表 fd 过滤到包含 CR 模式的文件中。
我发现对我感兴趣的文件进行别名可以帮助我创建更简单的脚本,然后总是试图记住如何获取所有这些文件。递归的东西也有效,但迟早你将不得不与淘汰特定的文件类型作斗争。这就是为什么我一开始就找到所有我感兴趣的文件类型。
您可以使用以下命令从文件中查找特定文本:
cat file | grep 'abc' | cut -d':' -f2
试试这个
find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
正如彼得在上一个答案中提到的那样,所有以前的答案都建议使用 grep 和 find。
但自 2001 年以来,有一种更复杂的方式使用Gnome Commander和完美的GUI和大量选项,查找文件只是其中之一。它也是一个免费的实用程序,经过时间证明。
GUI 搜索替代方案 - 桌面使用:
- 因为问题不是精确地要求命令
Searchmonkey:高级文件搜索工具,无需使用正则表达式为您的系统建立索引。图形等效于 find/grep。适用于 Linux (Gnome/KDE/Java) 和 Windows (Java) - 开源 GPL v3
特征:
下载 - 链接:
.
截屏:
我正在尝试找到一种方法来扫描我的整个 Linux 系统以查找包含特定文本字符串的所有文件。...这接近正确的方法吗?如果没有,我该怎么办?...这种在文件中查找文本字符串的能力对于我正在做的一些编程项目非常有用。
虽然您不应该用不同的程序替换(或别名)系统命令,但由于存在神秘破坏脚本或其他实用程序的风险,如果您手动或从您自己的脚本或程序运行文本搜索,您应该考虑最快的合适的多次搜索大量文件时的程序。在对您描述的用例进行几次使用后,您可以恢复安装和熟悉更好的实用程序所花费的十分钟到半小时的时间。
提供“ ack、ag、git-grep、GNU grep 和 ripgrep的功能比较”的网页可以帮助您决定哪个程序提供您需要的功能。
Andrew Gallant 的博客声称:“ ripgrep 比 {grep, ag, git grep, ucg, pt, sift} 更快”(其他一些人共享的声明,这就是为什么功能比较很有帮助)。特别感兴趣的是他关于正则表达式实现和陷阱的部分。
以下命令搜索所有文件,包括隐藏文件和可执行文件:
$ rg -uuu foobar
Silver Searcher (ag) 声称它比 Ack 快 5-10 倍。在其他一些答案中建议使用此程序。GitHub 不像 ripgrep 那样新近出现,而且明显有更多的提交和分支,但发布的版本更少,很难根据这些统计数据得出绝对的声明。简短版本: ripgrep更快,但学习曲线很小,不会被差异所吸引。
那么接下来会是什么,你猜对了,白金搜索者。声称是:它搜索代码的速度比 ack 快大约 3-5 倍,但它的速度与银牌搜索器相当。它是用 GoLang 编写的,可以搜索 UTF-8、EUC-JP 和 Shift_JIS 文件;如果这更有趣。GitHub 既不是最近也不是特别活跃。GoLang 本身有一个快速而强大的正则表达式,但如果它有更好的用户兴趣,那么白金搜索器会被更好地推荐。
对于速度和功能强大的索引查询语言(例如ElasticSearch或Solr )的组合,可能是一项有回报的长期投资,但如果您想要快速简单地替代 grep,则不是。OTOH 都有一个 API,可以从您编写的任何程序中调用,从而为您的程序添加强大的搜索功能。
虽然可以生成外部程序、执行搜索、拦截其输出并对其进行处理,但调用 API 是提高功率和性能的方法。
This question was protected Aug 6 '15 at 19:34 with this caution:
我们正在寻找提供一些解释和背景的长答案。不要只给出一条线的答案;解释为什么你的答案是正确的,最好是引用。
虽然一些答案提出了完成搜索的替代方法,但除了“免费”、“更快”、“更复杂”、“大量功能”等之外,他们没有解释为什么。不要试图出售它,只是告诉我们“为什么你的答案是正确的”。我试图教如何选择最适合用户的东西,以及为什么. 这就是为什么我在已经有这么多的时候提供另一个答案的原因。否则,我同意已经有很多答案了;我希望我带来了很多新东西。
我的用例是找到我以前写过的 Python 代码,它以特定的方式编写了 jsonlines。我知道这jsonl
将是函数名称的一部分,并且to_json
会出现在正文中,但仅此而已。
尽管有 50 个答案,但在同一文件中找到多个字符串(无论是否在同一行中)仍未得到解答。
in grep 是为了-q
安静。什么都不打印,只设置返回值。因此-print
在最后。每个-exec
仅在前一个成功的情况下运行。因此,如果您有很多文件,考虑消除您不感兴趣的文件的模式是值得的。
find . -type f -name "*.py" \
-exec grep -q -e 'to_json' {} \; \
-exec grep -q -e 'def\s.*jsonl' {} \; \
-print
你的命令是正确的。您只需要添加-l
到 grep:
find / -type f -exec grep -l 'text-to-find-here' {} \;
试试这个命令。这将为您提供包含您输入的模式的文件。
sudo grep -inr "your-pattern" /
这里: i - 忽略大小写区别,以便仅大小写不同的字符相互匹配。
n - 确保实际行内容的第一个字符位于制表位上,以便制表符的对齐方式看起来正常。
r - 递归地读取每个目录下的所有文件,仅当它们在命令行上时才遵循符号链接。请注意,如果没有给出文件操作数,grep 会搜索工作目录。
请根据需求自定义以下命令,并从文件中递归查找任何字符串。
grep -i hack $(find /etc/ -type f)
您还可以使用awk
:
awk '/^(pattern)/{print}' /path/to/find/*
pattern
是您要在文件中匹配的字符串。
查找任何名称为“ .kube/config
”的文件,内容包括eks_use1d
:
locate ".kube/config" | xargs -i sh -c 'echo \\n{};cat {} | grep eks_use1d'