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

San*_*kar 2 bash find echo cat jq

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

find . -name '*.json' -exec echo "{\"filename\": \"{}\", \"content\": `cat {}` }," \;
Run Code Online (Sandbox Code Playgroud)

我得到:

{"filename": "./a.json", "content":  },
{"filename": "./b.json", "content":  },
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

find . -name '*.json' -exec echo "{\"filename\": \"{}\", \"content\": cat {} }," \;
Run Code Online (Sandbox Code Playgroud)

我得到:

{"filename": "./a.json", "content": cat ./a.json },
{"filename": "./b.json", "content": cat ./b.json },
Run Code Online (Sandbox Code Playgroud)

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

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

find . -name '*.json' -exec cat {} \;
Run Code Online (Sandbox Code Playgroud)

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

Ini*_*ian 7

bash不使用find你可以在下面做。您可以使用nullglobglobstar递归 JSON 文件名遍历

shopt -s nullglob globstar
Run Code Online (Sandbox Code Playgroud)

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

jq '{ filename: input_filename, content: . }' **/*.json
Run Code Online (Sandbox Code Playgroud)

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

jq -n '[inputs | { filename: input_filename, content: . }]' **/*.json
Run Code Online (Sandbox Code Playgroud)

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

  • @Philippe:“-n”构造通常用于从头开始构造 JSON 对象。在上面的示例中,“filename”和“content”是新创建的。当新构建 JSON 时,“inputs”提供所有组合在一起的文件的内容。由于我们没有使用 slurp 模式,因此过滤器应用于每个对象,并且“input_filename”获取当前处理的文件的名称(内部) (2认同)