grep -r "print " */*/*/*/*/*.py */*/*/*/*.py */*/*/*.py */*/*.py
我想在我当前目录的子目录"print "
中查找所有文件中的所有出现。.py
我想出了上面的命令并且它可以工作,但我想找到某种方式来获得任意深度,因为我的一些文件深度为 3,其他文件深度为 4,其他文件深度更高。
我很确定我可以使用find
然后管道,但我不太确定如何。
在 bash 和 zsh 上,您可以使用**
:
grep "print " **/*.py
如果双星在您选择的外壳上不可用,那么您可以使用xargs
如下:
find . -regex ".*\.py" -print0 | xargs -0 grep "print "
尝试find
使用-exec
find -type f -name '*.py' -exec grep -H 'print ' {} \;
为了获得更好的性能,请find
使用xargs
find -type f -name '*.py' -print0 | xargs -0 grep 'print '
不需要管道。
find some/dir -name '*.py' -exec grep -H "print " {} \;
如果您grep
支持该--include
选项,请使用它:
grep -R --include='*.py' 'print ' .
这绝对是这里最好的选择。其他答案中的xargs
选项可能会更好,因为它以有效的方式使用多线程。
有趣的是:要判断您是否grep
处理此选项,您当然man grep
可以在其中搜索--include
带有击键的字符串,/--include
或者您可以:
man grep | grep -- --include
或者
grep --help | grep -- --include
否则,由于没有人提到-exec ... +
使用的方式find
,这里是:
find -type f -name '*.py' -exec grep -H 'print ' {} +
但这还不如grep --include
方法。但如前所述,方法的多线程能力xargs
应该表现得更好。