grep
命令有效,但是我不知道如何在每个目录中使用它(我只能在当前目录中使用它)。我尝试阅读man grep
,但没有任何帮助。#1 楼
最好使用grep -rl "string" /path
其中
-r
(或--recursive
)选项用于遍历同样是/path
的所有子目录,而-l
(或--files-with-matches
)选项仅用于打印匹配文件的文件名,而不打印匹配行(鉴于grep
停止,这也可以提高速度首先使用此选项读取文件)。评论
实际上,如果“字符串”是要查找的文本模式,则最好使用该功能,否则当字符串包含点或特殊字符(在正则表达式中具有含义)而不仅仅是应该作为字符串找到的点时,有人可能会遇到问题。 ,原样。然后,我将使用-rlF开关,将-F用作“固定字符串”(而不是regexp-例如)。当然,如果任务是使用正则表达式,请原谅。当然,同样的理论也没有-r,我经常看到人们假设grep搜索“文本”,这会引起一些问题,这些特殊问题意味着正则表达式。
– LGB
2011年8月1日12:19
还有-i标志,它忽略大小写。
– Marco Ceppi♦
2011年8月1日下午13:15
我只想展示--recursive选项,有很多可以谈论的选项和使用场景。我从@dmityugov接受的答案开始,并修改为找不到。
– Enzotib
2011年8月1日在13:42
@ N.N .:完成:-)
– Enzotib
2011年8月8日在16:04
@ScottBiggs:带有--include'* .h'选项
– Enzotib
16年6月18日在21:23
#2 楼
如果要在文件中查找匹配的行,我最喜欢的命令是:搜索多个文件时)
-H
进行递归搜索-r
导致打印行号-n
可以是path/to/files
进行搜索当前目录我觉得非常有用的其他选项:
.
忽略二进制文件(补充:-I
将所有文件都视为文本)-a
将-F
视为文字而不是正则表达式search term
进行不区分大小写的搜索-i
即使在通过--color=always
进行配管时也强制使用颜色。要使less
支持颜色,您需要使用less
选项: br /> 评论
如果可能的话,一个文件夹上的-H是多余的,如果有一个以上的文件。实际上,手册页上显示-H,--with-filename:打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。
– Enzotib
2011年8月1日在12:31
我不知道,它总是按我预期的那样工作。查找文件时这是我的默认命令。
– Lekensteyn
2011年8月1日12:34
有没有办法只考虑扩展名为.a的文件(并将其与-r结合使用)?
–user2413
2012年11月4日在22:54
@ user2413尝试--include'*。*'
– Lekensteyn
2012年11月5日15:24
@alper尝试grep --exclude ='*〜'...
– Lekensteyn
19-09-21在8:27
#3 楼
我相信您可以使用类似这样的东西:给定路径的子目录中的目录和链接。如果您未指定文件名应满足的掩码,则它会枚举所有目录对象。 />find
指定对于找到的每个文件,应运行grep命令,并将其文件名作为参数传递给该文件,方法是将-type f
替换为文件名评论
仅对于那些不知道的人,添加-name'* .py'会将匹配项限制为以'.py'结尾的文件。
–丹尼尔F
2014年3月23日在1:10
我喜欢这涵盖了在其grep命令中未实现-R的客户端。
–敬畏
2014年8月11日在20:29
如果要打印匹配的行AND文件名,则使exec像这样:... -exec bash -c'grep -r“ mystring” {} && echo {}'\;
–唐·李(Donn Lee)
19年5月6日在23:24
直接使用grep的相对性能是多少?
–乔纳森
19年7月17日在14:10
@Donn Lee认为最好使用-exec bash -c'grep -H“ pattern” $ 1'_ {} \;
–bac0n
20-4-25在21:57
#4 楼
我的默认命令是grep -Rin string *
我使用国会大厦“ R”,因为
ls
将其用于递归。由于grep接受两者,因此没有理由不使用它。编辑:根据HVNSweeting,显然
-R
将遵循符号链接,而-r
则不会。评论
要也搜索隐藏文件,请运行shopt -s dotglob(记住-s为“ set”)。然后删除文件时要小心。如果启用了dotglob,则rm -r *会删除当前目录中的所有内容,还会删除其上的目录,因为..匹配。要禁用dotglob,请使用shopt -u dotglob(“未设置”)。尽管更改是暂时的,但仅适用于当前shell。
– Lekensteyn
2011年8月1日19:09
我忘记了这一点。有没有一种方法可以将其设置为一行?像shopt -s dotglob和
–user606723
2011年8月1日19:42
另外,使用grep -Rin string可能更容易。在大多数情况下。我只使用*,因为它看起来更自然。
–user606723
2011年8月1日19:44
如果您使用递归grep,则可以从“。”开始。代替 ”*”。无需dotglob。
–
2011年8月7日在16:32
对此表示赞成,在联机帮助页中没有提及的一件事是R将跟随符号链接,r不
–HVNSweeting
2013年1月25日下午4:06
#5 楼
如果您愿意尝试新的东西,请尝试一下。递归搜索当前目录中的ack
的命令是:ack string
安装非常简单:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(假设您已经有了目录
string
,最好在您的~/bin
中。)评论
或者只是apt-get install ack-grep(然后在您的.bashrc中添加别名ack = ack-grep)
– markijbema
2011年8月1日在20:37
chmod命令的最后一个参数做什么?它们是特定于chmod还是与bash相关(!#:3部分)?
–艾略特·达芬克(Elliott Darfink)
2014年1月21日上午10:06
@ElliottDarfink正在使用Bash的历史记录功能–!是事件指示符。它们非常强大,可以避免重复。 !#:3到目前为止已引用了命令行的第三个标记,即本例中的〜/ bin / ack。
–康拉德·鲁道夫(Konrad Rudolph)
2014年1月21日在16:59
#6 楼
rgrep命令专用于此类需求如果不可用,您可以这样获得它
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
您可以直接设置为默认值grep选项如上所述。
我个人使用
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
相关主题:如何始终将rgrep与颜色一起使用
评论
rgrep由grep软件包提供,该软件包默认安装在Ubuntu中。
–卡雷尔
15年1月2日,14:16
#7 楼
更新2:使用
find
和grep
的这一行命令解决了以下问题:$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
用于彩色输出:$ find path_to_search_in -type f \
-exec grep --color=always -in searchString {} 2>/dev/null +
示例:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
以下快照中的示例运行:
更新1:
您可以尝试以下代码;作为您的
.bashrc
或.bash_aliases
或脚本中的函数:wherein ()
{
for i in $(find "" -type f 2> /dev/null);
do
if grep --color=auto -i "" "$i" 2> /dev/null; then
echo -e "3[0;32mFound in: $i 3[0m\n";
fi;
done
}
用法:
wherein /path/to/search/in/ searchkeyword
示例:
$ wherein ~/Documents/ "hello world"
(注意:如@enzotib在下面的注释中所建议的,这不适用于文件/目录,包括名称中的空格。)
原始文章
要搜索字符串并输出带有搜索字符串的那一行:
$ for i in $(find /path/of/target/directory -type f); do \
grep -i "the string to look for" "$i"; done
eg:
$ 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;
评论
包含空格的文件名失败。没有显示stderr的事实掩盖了失败。
– Enzotib
15年1月13日在9:38
@enzotib感谢您指出这一点..对于指定的功能来说仍然无法解决..不过,我添加了另一种衬里..
–精确
15年1月13日在20:38
现在答案类似于@dmityugov。
– Enzotib
15年1月13日在21:28
是的,但是从这个意义上说,如果您检查它们在使用grep方面的相似之处,则此页面中的大多数答案都非常相似,其次是使用find with grep的子集...但是如果您要接受不同的开关和调整作为不同的答案,可能我的也适合这里..还是您与众不同?最后一次更新符合我在搜索中的要求:文件名带有搜索键的行和行号。也:)以及彩色输出和错误过滤器,以提高可读性。
–精确
2015年1月14日在6:44
#8 楼
grep
(GNU或BSD)您可以使用
grep
工具以-r
参数递归搜索当前文件夹,例如:grep -r "pattern" .
注意:
-r
-递归搜索子目录。要在特定文件中搜索,可以使用以下语法:
grep "class foo" **/*.c
注意:通过使用globlob选项(
**
),它将以特定的扩展名或模式递归扫描所有文件。要启用此语法,请运行:shopt -s globstar
。您还可以对所有文件(隐藏文件和无扩展名除外)或任何其他模式使用**/*.*
。语法,例如:find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
或者使用
find
。项目或大文件,应改用ripgrep
,例如:rg "pattern" .
在GitHub项目页面上查看文档,安装步骤或源代码。
它比GNU / BSD
ripgrep
,ripgrep
,grep
,ucg
,ag
,sift
或类似工具之类的任何其他工具都要快得多,因为它建立在Rust的正则表达式引擎之上,该引擎使用有限自动机,SIMD和积极的文字优化来进行搜索非常快。它支持
ack
文件中指定的忽略模式,因此单个文件路径可以与多个glob模式同时匹配您可以使用常见参数,例如:
pt
-不敏感的搜索。.gitignore
-忽略二进制文件。-i
-搜索整个单词(与部分单词匹配相反)。-I
-显示匹配的行。 -w
/ -n
(例如-C
)-增加上下文,因此您会看到周围的代码。--context
-标记匹配的文本。-C5
-显示找到文本的文件名。--color=auto
-显示匹配的行数。可以与-H
结合使用。#9 楼
我使用xargs来执行此操作,这是一个被低估的命令find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
find ./为您提供当前文件夹中所有文件的递归列表
,然后进行管道传输它到xargs,在每个文件中的每个文件上执行grep命令
评论
不建议使用不带-print0选项的xargs来查找,而不建议给xargs使用-0选项,它将对包含空格的文件名失败。
– Enzotib
2011年8月1日15:45
@enzotib我已经按照您的建议编辑了答案。-请仔细阅读,如果需要编辑和更正,我将很乐意由您重新编辑。谢谢
–αғsнιη
2015年1月13日9:00
@KasiyA:现在可以,删除我的否决票。
– Enzotib
15年1月13日在9:32
#10 楼
我知道这里有很多答案,但是如果您要在搜索文件时添加其他限制,可以使用以下替代方法:如果找到结果,则为0,否则为1。例如,您可以找到1 MB大的文件,其中包含以下内容:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
对于多种需求,您可能想要使用GNU grep中存在的优化器标志
grep
。 />#11 楼
用于搜索C,CPP代码的脚本(查找代码):#!/bin/sh
find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n ""
使用:
find-in-code "search string"
评论
grep -RIn <您的模式> *将在所有文本文件中从当前目录向下搜索。不确定如何仅使用grep以* .C之类的文件模式进行递归搜索
带有--include =“ *。C”选项的通配符@ user311346,感谢@Lekensteyn。
使用find和grep组合可递归地在文件中搜索当前目录和所有子目录中的字符串。检查此wilddiary.com/find-files- contains-my-text