You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:22:52