我在目录结构中有一堆 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 作用相同)
我在这里做错了什么?这是不可能的吗?
;
是shell 的命令分隔符。它之后的所有内容都将是一个单独的命令,不会传递给find
,因为命令解析是在执行之前完成的。同样,&>/dev/null
适用于整个 find
命令,而不仅仅是php
,无论它位于何处(之前、中间或之后)。
要在您的-exec
or 中使用此类运算符-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' -- {} \;