在bash中用JSON文件的名称和内容创建一个JSON对象。

问题描述 投票:1回答:2

我有一些 .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 },

那么我如何使 a.jsonb.json 内容 cated正确吗?

另外,如果我这样做。

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

json文件就会在控制台正确打印出来 所以我知道文件的内容是有效的。

bash find echo jq cat
2个回答
0
投票

通过简单的 :

$ 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 } }

7
投票

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

shopt -s nullglob globstar

默认情况下 jq 提供一个函数 input_filename 打印当前正在处理的文件名。文档中说,只要locale是这样,就可以正常工作。UTF-8

jq '{ filename: input_filename, content: . }' **/*.json

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

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

对于同一线路上的紧凑输出,请使用 "L"。-c 标榜 jq -c '..'

© www.soinside.com 2019 - 2024. All rights reserved.