find命令未逐个传入PHP文件执行,输出JSON文件异常问题
问题分析与解决方法
原命令的错误原因
你原命令中的重定向符号 > 是由父 Shell 处理的,而非 find 命令在遍历每个文件时动态替换。这导致 {} 被当作字面字符串处理,所有 PHP 文件的输出都被写入到同一个名为 {}.json 的文件中,而非每个文件对应单独的 JSON 文件。
修正后的命令
要实现每个 PHP 文件输出到对应命名的 JSON 文件(并去掉 .php 后缀),需要将命令封装到子 Shell 中,让重定向和文件名替换在每次遍历文件时执行。以下是修正后的命令:
cd blog mkdir -p ../build/blog # 确保输出目录存在,避免报错 find ./ -iname "*.php" -exec sh -c 'php "$1" > "../build/blog/$(basename "$1" .php).json"' _ {} \;
命令拆解
mkdir -p ../build/blog:提前创建目标输出目录,如果目录已存在则不会报错。-exec sh -c '...' _ {} \;:为每个找到的 PHP 文件启动一个子 Shell 执行命令,其中:_是子 Shell 的$0占位符(无实际作用),{}会被替换为当前遍历到的 PHP 文件路径。basename "$1" .php:提取文件名并移除.php后缀(例如./hello.php会变成hello)。php "$1" > "../build/blog/$(basename "$1" .php).json":执行 PHP 文件,并将输出写入对应名称的 JSON 文件。
替代方案(不使用 basename)
如果你习惯用 Shell 参数扩展处理文件名,可以改用以下命令:
cd blog mkdir -p ../build/blog find ./ -iname "*.php" -exec bash -c 'file="$1"; php "$file" > "../build/blog/$(basename "${file%.php}").json"' _ {} \;
这里 ${file%.php} 会移除文件名末尾的 .php 后缀,再通过 basename 去掉前面的路径前缀,最终得到纯净的文件名。
内容的提问来源于stack exchange,提问作者learningtech
相关产品推荐
相关产品推荐

