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.json
和b.json
内容cat
呢?
顺便说一句,如果我这样做:
find . -name '*.json' -exec cat {} \;
Run Code Online (Sandbox Code Playgroud)
json 文件在控制台中正确打印,所以我知道文件内容是有效的。
bash
不使用find
你可以在下面做。您可以使用nullglob
和globstar
递归 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 '..'