【问题标题】:*nix: Performing nested -exec with find command*nix: 使用 find 命令执行嵌套 -exec
【发布时间】:2014-04-08 17:40:52
【问题描述】:

我正在尝试执行以下操作:查找所有 777 个目录,然后在这些目录中查找那些包含字符串“mail(”的 php 文件。我的目标是使这部分成为 cron-job它每天晚上运行,并找到所有包含邮件功能的 php 文件,这些文件可能已被偷偷插入到我们的服务器上。所以,我写了这个命令:

find -type d -perm 777 -exec find {} -name "*.php" \; -exec grep "mail(" {} \;

哪个(应该):

1:找到777权限的文件夹

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

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

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

find -exec with multiple commands

这让我相信 -exec 的嵌套是可能的。有什么明显的我失踪了吗?提前感谢您的宝贵时间!

【问题讨论】:

    标签: php linux grep find exec


    【解决方案1】:

    试试这个

    find somewhere -type d -perm 777 -execdir grep mail *.php
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      更简单的 90% 版本将只使用 grep 进行递归:

      find . -type d -perm 777 -exec grep -HR 'mail(' \; | grep '\.php'
      

      【讨论】:

      • 您能解释一下为什么内部 {} 仅在表示为 {""} 时才有效吗?
      • @UndergroundCoding 外部查找find 替换了它看到的两个字符串{},但{""} 是一个它无法识别的四个字符串
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2013-01-13
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      相关资源
      最近更新 更多