使用 exec 查找:如何对每个文件执行多步条件操作

Sud*_*dhi 4 linux bash find

我在目录结构中有一堆 php 文件说 /mylibs
我想php -l $file在每个 php 文件上运行一个简单的检查语法错误的文件

find /mylibs -type f -iname "*.php" -exec php -l {} &>/dev/null \;
Run Code Online (Sandbox Code Playgroud)

这是第一步, &>/dev/null 会从 php 中获取详细输出(是否发现语法错误)

php -l如果没有发现错误取决于返回0赖以,我想将它们拷贝到其它目录的发言权/mybin。为了检查这是否按预期工作,我试过

find /mylibs -type f -iname "*.php" -ok php -l {} &>/dev/null ; echo $? \;
Run Code Online (Sandbox Code Playgroud)

但这只是在终端上打印 1 并且不要求确认(-ok 与交互式确认后的 -exec 作用相同)

我在这里做错了什么?这是不可能的吗?

use*_*686 5

;shell 的命令分隔符。它之后的所有内容都将是一个单独的命令,不会传递给find,因为命令解析是在执行之前完成的。同样,&>/dev/null适用于整个 find命令,不仅仅是php,无论它位于何处(之前、中间或之后)。

要在您的-execor 中使用此类运算符-ok,您必须显式调用 shell:

find ... -exec bash -c 'php -l "{}" >&/dev/null; 回声 $?' \;

请注意,特殊字符在引号内,这意味着它们将按字面传递给find,然后传递给bash

这不那么简单,但使用“奇怪”的文件名可能更可靠:

find ... -exec bash -c 'php -l "$1" >&/dev/null; 回声 $?' -- {} \;

这将以更易读的形式显示结果:(这完全是关于 bash 脚本现在,不再是关于find

查找 ... -exec bash -c '
    如果 php -l "$1" >&/dev/null; 然后
        echo "$1: pass"
    别的
        echo "$1: 失败"
    fi' -- {} \;