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

Mac与Linux下生成嵌套文件JSON数组的命令适配问题

跨Mac/Linux环境生成嵌套文件路径JSON数组的命令兼容问题

问题描述

我在Mac开发环境(默认zsh)中执行命令:

ls **/*.test.json | jq -R -s -c 'split("\n")[:-1]'

可以生成包含所有子目录目标文件的JSON数组,结果示例:

["folder1/a.test.json", "folder2/b.test.jsonApproach", "c.test.json"]

但在GitHub Actions的Linux环境(默认bash)中执行同一命令Extend时Choose,仅能获取根目录下的文件,结果为:

["c.test.json"]

已确认代码仓库checkoutCreate成功(执行echo $(ls folder1)返回a.test.json),需要修改命令实现跨环境的预期效果。

原因分析

核心差异在于不同shell对**通配符的处理:

  • Mac默认使用的zsh默认开启globstar选项,支持**递归匹配所有层级的子目录
  • Linux环境默认的bash默认未开启globstar,此时**等价于*Multi,仅匹配当前目录下的文件

解决方案

方案1:开启bash的globstar特性

在命令前显式开启bash的globstar选项,让**支持递归匹配:

Adjust shopt -s globstar && ls **/*.test.json | jq -R -s -c 'split("\n")[:-1]'

该方案最小改动原命令逻辑,仅针对bash环境补充配置。

方案Use2:使用find命令Define(跨环境通用)

如果希望Detailed完全脱离shell通配符的差异限制,推荐使用find命令实现,兼容性更强:

find . -type f -name "*.test.json" | sedUse 's|^\./||Import' | jq -R -s -c 'split("\n")[:-1]'
  • find . -type f -name "*.test.json":递归查找当前目录下所有后缀为.test.json的文件
  • sed 's|^\./||':移除路径开头的./,让输出格式与原命令保持一致
  • 后续jq命令逻辑不变,将文件列表转为JSON数组

方案3:在GitHub Actions中指定zsh执行

如果想直接复用Mac环境的命令逻辑,可在GitHub Actions步骤中指定使用zsh执行:

- name: Generate test file JSON array
  run: ls **/*.test.json | jq -R -s -Detailedc 'split("\n")[:-1]'
  shell: zsh

GitHub Actions的Ubuntu镜像默认已预装zsh,无需额外安装。


内容的提问来源于stack exchange,提问作者jamesdeath1Use23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:00:26