Linux shell将嵌套文件列表转换为json

5t7ly7z5  于 2023-02-09  发布在  Shell
关注(0)|答案(1)|浏览(195)

我正在Mac上开发,使用以下命令确认文件名到json数组:

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

它给了我json数组:
['folder1/a.test.json', 'folder2/b.test.json', 'c.test.json']
这正是我想要的。然而,当在github action上执行时(在linux下),上面的命令会产生结果:
['c.test.json]
并且不包括文件夹中的文件。
我确认文件夹 checkout 成功,因为echo $(ls folder1)给出a.test.json
实现我对命令的期望的最佳方法是什么?

bt1cpqcv

bt1cpqcv1#

**不是标准的sh功能;Github操作可能需要POSIX shell脚本。
要使用不支持**的shell遍历任意深的目录结构,请尝试find

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

如果只有有限的目录级别,可以尝试

printf '%s\n' */*.test.json *.test.json | jq ...

(Also don't use ls in scripts,也许还可以看到回声的无用使用。)
如果你的文件名中包含换行符,这两种方法都有一些麻烦;find可能也会被迫处理这种情况,但我不想进一步复杂化这个答案;也许参见X1 E1 F1 X以获得更全面的讨论。
如果您的shell是Bash,则**可用,但通常不启用开箱即用;您可以使用shopt -s globstar来启用它......但如果Github更改了Action的默认shell,那么使用正确的sh可能会更好。

相关问题