Bash 具有任意深度的某些扩展的Grepping

Bash 具有任意深度的某些扩展的Grepping,bash,grep,pipe,Bash,Grep,Pipe,我想在我当前目录的子目录中的所有.py文件中查找“print”的所有文档。我想出了上面的命令,它是有效的,但我想找到一种方法来获得任意深度,因为我的一些文件的深度为3,其他文件的深度为4,其他文件的深度甚至更高 我很确定我可以使用查找然后使用管道,但我不确定如何使用。不需要管道 grep -r "print " */*/*/*/*/*.py */*/*/*/*.py */*/*/*.py */*/*.py 在bash和zsh上,您可以使用**: find some/dir -name '*.p

我想在我当前目录的子目录中的所有
.py
文件中查找
“print”
的所有文档。我想出了上面的命令,它是有效的,但我想找到一种方法来获得任意深度,因为我的一些文件的深度为3,其他文件的深度为4,其他文件的深度甚至更高

我很确定我可以使用
查找
然后使用管道,但我不确定如何使用。

不需要管道

grep -r "print " */*/*/*/*/*.py */*/*/*/*.py */*/*/*.py */*/*.py

在bash和zsh上,您可以使用
**

find some/dir -name '*.py' -exec grep -H "print " {} \;
如果您选择的外壳上没有双星,则可以使用
xargs
如下:

grep "print " **/*.py

尝试使用
find
-exec

find . -regex ".*\.py" -print0 | xargs -0 grep "print "

要获得更好的性能,请将
find
xargs

find -type f -name '*.py' -exec grep -H 'print ' {} \;

如果您的
grep
支持
--include
选项,请使用它:

find -type f -name '*.py' -print0 | xargs -0 grep 'print '
这绝对是最好的选择。其他答案中的
xargs
选项可能更好,因为它以高效的方式使用多线程


有趣的是:要判断您的
grep
是否处理此选项,您当然可以
man grep
然后在其中搜索字符串
——用按键
/--include
,或者您可以:

grep -R --include='*.py' 'print ' .


否则,因为没有人提到
-exec+使用方法
查找
,如下所示:

grep --help | grep -- --include

但这不如grep--include
方式好。但是如前所述,使用
xargs
的方法的多线程功能应该表现得更好。

这是非常低效的,因为
grep
将在每个python文件中执行一次。对于大目录树,这很重要。非常感谢,这个解决方案(也是@jkshah的解决方案)的问题是,在打印之前,它们没有列出文件名和位置。对于bash,您需要设置
shopt-s globstar
。很抱歉,没有
t
,应该是
globstar
。我编辑了评论。它还需要BashV4或更高版本。不,为了获得更好的性能,请使用
find-typef-name'*.py'-execgrep-H'print'{}+
(最后使用
+
)@gniourf\u gniourf-Ohh!我不知道这个选择,可能是第三个选择。但我在某个地方读到,
xargs
方法是最有效的。如果我错了,请纠正我。谢谢你的建议。我怀疑
xargs
方法是否最有效。与
find-type f-name'*.py'-exec grep-H'print'{}+
方法相比,它将有一个管道和一个分叉开销。@gniourf\u gniourf请参阅。如果你仍然不同意,一些参考资料会很有帮助。经过几次天真的测试后,
xargs
方式似乎获胜了。我已经相应地编辑了我的答案。再次感谢您指出这一点!
grep --help | grep -- --include
find -type f -name '*.py' -exec grep -H 'print ' {} +