% find . -maxdepth 1 -type d | wc -l
336
% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py' 1.24s user 2.23s system 283% cpu 1.222 total
% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$' 2.71s user 1.55s system 116% cpu 3.651 total
% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py' 1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs 6.65s user 0.49s system 32% cpu 22.164 total
如果您经常搜索代码,Ag (The Silver Searcher)是grep的一个更快的替代方法,默认情况下's customized for searching code. For instance, it'递归并自动忽略 .gitignore 中列出的文件和目录,因此您不必继续将相同的繁琐排除选项传递给grep或find .
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .
real 0m9.458s
user 0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .
real 0m6.296s
user 0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .
real 0m5.641s
user 0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache
real 0m0.154s
user 0m0.224s
sys 0m0.172s
$ cat script.sh
#!/bin/sh
cd "$1"
loop () {
for i in *
do
if [ -d "$i" ]
then
# echo entering "$i"
cd "$i"
loop "$1" "$2"
fi
done
if [ -f "$1" ]
then
grep -l "$2" "$PWD/$1"
fi
cd ..
}
loop "$2" "$3"
运行它和示例输出:
$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
24 回答
以下是在
Unix
和Linux
环境中递归搜索String
的命令 .for
UNIX
命令是:for
Linux
命令是:请注意,当find匹配的文件太多时,
find . -type f | xargs grep whatever
种解决方案将遇到"Argument list to long"错误 .最好的选择是
grep -r
,但如果没有,请改用find . -type f -exec grep -H whatever {} \;
.我想这就是你要写的东西
如果你想找到grep命中的文件,这可能是其他有用的东西
在2018年,您希望使用
ripgrep
或the-silver-searcher
,因为它们比替代方案更快 .这是一个包含336个第一级子目录的目录:
在OSX上,这会安装
ripgrep
:brew install ripgrep
. 这将安装silver-searcher
:brew install the_silver_searcher
.如果您只想关注实际目录,而不是符号链接,
如果你想跟随符号链接和实际目录(注意无限递归),
由于您尝试递归grep,以下选项也可能对您有用:
因此,如果要在当前目录或任何子目录中查找包含Darth Vader的所有文件并捕获文件名和行号,但不希望递归遵循符号链接,则命令将为
如果你想在目录中找到所有提到的单词cat
而你目前在目录中
并且您想要捕获文件名但不是字符串“cats”的任何实例的行号,并且您希望递归遵循符号链接,如果找到它们,您可以运行以下任一项
资源:
运行“grep --help”
对符号链接的简短介绍,对于任何阅读此答案的人而言,我对他们的引用都很困惑:https://www.nixtutor.com/freebsd/understanding-symbolic-links/
有关可用标志的列表:
返回当前目录中regexp texthere的所有匹配项,以及相应的行号:
返回texthere的所有匹配项,从根目录开始,使用相应的行号并忽略大小写:
flags used here:
-r
递归-n
打印带输出的行号-i
忽略大小写或者安装确认,如果你想要更快的方式并且正在做这么多 .
在POSIX系统中,您找不到
grep
的-r
参数,而您的grep -rn "stuff" .
将无法运行,但如果您使用find
命令,它将:find . -type f -exec grep -n "stuff" {} \; -print
同意
Solaris
和HP-UX
.如果你知道你想要的文件的扩展名或模式,另一种方法是使用
--include
选项:您还可以提及要使用
--exclude
排除的文件 .Ag
如果您经常搜索代码,Ag (The Silver Searcher)是grep的一个更快的替代方法,默认情况下's customized for searching code. For instance, it'递归并自动忽略
.gitignore
中列出的文件和目录,因此您不必继续将相同的繁琐排除选项传递给grep或find .我现在总是使用(甚至在Windows上使用GoW -- Gnu on Windows):
这包括以下选项:
如果我想要不区分大小写的结果,我可以添加'
i
'(-nRHIi
) .我可以得到:
这应该工作:
ag是我现在最喜欢的方式github.com/ggreer/the_silver_searcher . 它与ack基本相同,但还有一些优化 .
这是一个简短的基准 . 我在每次测试前清除缓存(参见https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache)
也:
但
grep -r
是一个更好的答案 .只是文件名也很有用
这是我当前机器上的情况(Windows 7上的git bash):
对于带空格的路径,我总是忘记-print0和-0 .
编辑:我现在的首选工具是ripgrep:https://github.com/BurntSushi/ripgrep/releases . 它真的很快并且有更好的默认值(默认情况下是递归) . 与我的原始答案相同,但使用ripgrep:
rg -g "*.cs" "content pattern"
grep -r "texthere" .
(通知期末)(^ credit:https://stackoverflow.com/a/1987928/1438029)
Clarification:
grep -r "texthere" /
(递归grep all 目录和子目录)grep -r "texthere" .
(递归grep这些目录和子目录)grep递归
grep帮助
$ grep --help
替代品
ack
(http://beyondgrep.com/)ag
(http://github.com/ggreer/the_silver_searcher)要查找
files
的名称,其中path
递归地包含UNIX
的特定string
使用以下命令:为
Linux
:在
UNIX
服务器上找到一个文件在LINUX服务器上找到一个文件
第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录 . 在这种情况下,
.
表示当前目录 .注意:这适用于GNU grep,在Solaris等某些平台上,您必须专门使用GNU grep而不是遗留实现 . 对于Solaris,这是
ggrep
命令 .globbing **
使用
grep -r
有效,但它可能过度,特别是在大文件夹中 .有关更实际的用法,以下是使用globbing syntax(
**
)的语法:只使用模式选择模式来抓取特定文件 . 它适用于支持的shell,如Bash 4或zsh .
要激活此功能,请运行:
shopt -s globstar
.另见:How do I find all files containing specific text on Linux?
git grep
对于Git版本控制下的项目,请使用:
哪个更快 .
ripgrep
对于较大的项目,最快的grepping工具是ripgrep,默认情况下递归greps文件:
它 Build 在Rust's regex engine之上,它使用有限自动机,SIMD和积极的文字优化来快速搜索 . 检查detailed analysis here .
只是为了好玩,如果@christangrant答案太多而无法输入,请快速搜索* .txt文件:-)
grep -r texthere .|grep .txt
在我的IBM AIX服务器(操作系统版本:AIX 5.2)中,使用:
这将在文件中打印出路径/文件名和相对行号,如:
./inc/xxxx_x.h
2865:/ **描述:stringYouWannaFind * /
无论如何,它适用于我:)
这是一个递归(轻轻地用bash和sh测试)函数,它遍历给定文件夹($ 1)的所有子文件夹,并使用
grep
搜索给定文件中的给定字符串($ 3)($ 2):运行它和示例输出:
如果要从目录结构中查找所有文件中的特定内容,可以使用
find
,因为您更清楚自己在做什么:请注意
-l
(L的小写)显示包含文本的文件的名称 . 如果您想打印匹配本身,请将其删除 . 或者使用-H
将文件与匹配一起获取 . 总之,其他替代方案是:-n
打印行号 .