*nix: 使用find命令执行嵌套的-exec操作
*nix: 使用find命令执行嵌套的-exec操作
我正在尝试做以下事情:追踪所有777目录,然后在这些目录中查找包含字符串"mail("的php文件。我的目标是将其作为定时任务的一部分,每晚运行并查找所有可能被偷偷插入到我们服务器上的包含邮件函数的php文件。所以,我写了这个命令:
find -type d -perm 777 -exec find {} -name "*.php" \; -exec grep "mail(" {} \;
它应该:
1:找到具有777权限的文件夹
2:对于每个这样的文件夹,找到其中包含的所有php文件
3:对于每个这样的文件,执行grep以找到字符串"mail("
然而,它似乎没有起作用。它给我列出了777权限目录中的php文件列表,但没有执行grep。我看了一些类似这样的stackoverflow帖子:
find -exec with multiple commands
这让我相信嵌套的-exec是可能的。我是否漏掉了什么明显的东西?提前感谢您的时间!
在执行上述命令时,会出现以下错误提示:
find: missing argument to `-execdir'
这是由于在-execdir参数后面没有指定要执行的命令所导致的。解决方法是在-execdir参数后面加上要执行的命令,并用分号(;)或加号(+)来结束-execdir参数的设置。
下面是正确的命令示例:
find somewhere -type d -perm 777 -execdir grep mail {} \;
或者
find somewhere -type d -perm 777 -execdir grep mail {} +
这样,find命令就会在指定的目录(somewhere)下搜索权限为777的文件夹,并在每个找到的文件夹中执行grep mail命令,以查找包含"mail"关键字的php文件。
通过在-execdir参数后面加上要执行的命令,并正确使用分号或加号来结束-execdir参数,我们可以解决在执行嵌套-exec命令时出现的错误。
在*nix系统中,使用find命令嵌套执行-exec是不可行的,但是可以使用嵌套的sh命令来调用find命令。对于GNU find,还需要重写内部find命令中的{},以防止外部find命令替换它。
以下是解决该问题的最直接方法:
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'
为什么内部的{}只有在表示为{""}时才起作用?
外部find命令会替换它所看到的两个字符的字符串{},但{""}是一个四个字符的字符串,它无法被外部find命令识别。