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

我想在我当前目录的子目录"print "中查找所有文件中的所有出现。.py我想出了上面的命令并且它可以工作,但我想找到某种方式来获得任意深度,因为我的一些文件深度为 3,其他文件深度为 4,其他文件深度更高。

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

4

4 回答 4

4

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

grep "print " **/*.py

如果双星在您选择的外壳上不可用,那么您可以使用xargs如下:

find . -regex ".*\.py" -print0 | xargs -0 grep "print "
于 2013-11-02T16:33:52.557 回答
3

尝试find使用-exec

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

为了获得更好的性能,请find使用xargs

find -type f -name '*.py' -print0 | xargs -0 grep 'print '
于 2013-11-02T16:34:08.267 回答
2

不需要管道。

find some/dir -name '*.py' -exec grep -H "print " {} \;
于 2013-11-02T16:33:38.373 回答
1

如果您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应该表现得更好。

于 2013-11-02T17:50:57.457 回答