为任意深度的某些扩展提供Grepping

时间:2013-11-02 16:31:23

标签: bash grep pipe

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

我想查找当前目录中子目录中所有"print "个文件中.py的所有发生情况。我想出了上面的命令并且它有效,但是我想找到某种方式来获得任意深度,因为我的一些文件的深度为3,其他文件的深度为4,其他文件的深度更高。< / p>

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

4 个答案:

答案 0 :(得分:3)

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

grep "print " **/*.py

如果您所选择的外壳上没有双星,那么您可以使用xargs之类的:

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

答案 1 :(得分:3)

尝试将find-exec

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

为了获得更好的效果,请将findxargs

一起使用
find -type f -name '*.py' -print0 | xargs -0 grep 'print '

答案 2 :(得分:2)

不需要管道。

find some/dir -name '*.py' -exec grep -H "print " {} \;

答案 3 :(得分:1)

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

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

这绝对是最好的选择。其他答案中的xargs选项可能更好,因为它以有效的方式使用多线程。


有趣:告诉您的grep是否处理此选项,您当然可以man grep然后使用按键--include在那里搜索字符串/--include,或者您可以:

man grep | grep -- --include

grep --help | grep -- --include

否则,由于没有人提到使用-exec ... +的{​​{1}}方式,因此它是:

find

但这不如find -type f -name '*.py' -exec grep -H 'print ' {} + 方式好。但如前所述,grep --include方法的多线程处理能力应该会更好。