*nix:使用find命令执行嵌套-exec

Cod*_*Owl 6 php linux grep exec find

我正在尝试执行以下操作:搜索所有777目录,然后在这些目录中搜索包含字符串"mail(")的php文件.我的目标是使这一部分的cron-job运行每一个晚上,找到所有包含邮件功能的php文件,这些邮件功能可能已秘密插入到我们的服务器上.所以,我写了这个命令:

find -type d -perm 777 -exec find {} -name "*.php" \; -exec grep "mail(" {} \;
Run Code Online (Sandbox Code Playgroud)

哪个(应该):

1:找到具有777权限的文件夹

2:对于每个这样的文件夹,找到其中包含的所有php文件

3:对于每个这样的文件,执行grep查找字符串"mail"

但是,它似乎没有起作用.它正在做的是给我一个777特权目录中的php文件列表,但它没有执行grep.我看过一些像这样的帖子:

使用多个命令查找-exec

这让我相信-exec的嵌套是可能的.有什么明显我想念的吗?在此先感谢您的时间!

tha*_*guy 5

您不能嵌套find -exec,但可以嵌套sh依次调用find -exec。使用 GNU find,您还必须重写{}内部查找中的 ,以便外部查找不会替换它:

find . -type d -perm 777 \
  -exec sh -c 'find "$1" -name "*.php" -exec grep "mail(" {""} \;' _ {} \;
Run Code Online (Sandbox Code Playgroud)

这是对你的问题最直接的回答。有多种简化方法:

find . -type d -perm 777 \
  -exec find {} -name '*.php' -print0 \; | xargs -0 grep -H 'mail(' 
Run Code Online (Sandbox Code Playgroud)

甚至更简单的 90% 版本仅用于grep递归:

find . -type d -perm 777 -exec grep -HR 'mail(' \; | grep '\.php'
Run Code Online (Sandbox Code Playgroud)