使用 JSON 文件的名称及其在 bash 中的内容创建一个 JSON 对象

Creating a JSON object with name of the JSON file and its content in bash

我的目录中有几个 .json 文件。如果我这样做:

find . -name '*.json' -exec echo "{\"filename\": \"{}\", \"content\": `cat {}` }," \;

我得到:

{"filename": "./a.json", "content":  },
{"filename": "./b.json", "content":  },

但是,如果我这样做:

find . -name '*.json' -exec echo "{\"filename\": \"{}\", \"content\": cat {} }," \;

我得到:

{"filename": "./a.json", "content": cat ./a.json },
{"filename": "./b.json", "content": cat ./b.json },

那么我该如何正确地 cat 编辑 a.jsonb.json 内容?

顺便说一句,如果我这样做:

find . -name '*.json' -exec cat {} \;

json 文件在控制台中正确打印,所以我知道文件内容是有效的。

简单 :

$ cat a.json
{ "a":123 }
$ cat b.json
{ "b":234 }
$ cat "foo/bar/base/c c.json"
{ "c": 456 }
$ shopt -s globstar # enable recursion with '**'
$ for i in **/*.json; do
    cat<<EOF
    { "filename": "$i", "content": $(cat "$i") }
EOF
done | tee file.json
$ cat file.json
{ "filename": "a.json", "content": {"a":123} }
{ "filename": "b.json", "content": {"b":234} }
{ "filename": "foo/bar/base/c c.json", "content": { "c": 456 } }

使用 bash 而不使用 find 您可以执行以下操作。可以使用nullglobglobstar进行递归JSON文件名遍历

shopt -s nullglob globstar

默认情况下jq提供了一个函数input_filename打印当前正在处理的文件名。文档说,只要语言环境是UTF-8

,它就可以正常工作
jq '{ filename: input_filename, content: . }' **/*.json

要在对象条目之间使用逗号,请将 -n 标志与 inputs 一起使用,并将整个结果放入数组 [..]

jq -n '[inputs | { filename: input_filename, content: . }]' **/*.json

对于同一行的紧凑输出,使用 -c 标志作为 jq -c '..'