如何在 Bash 中使用 jq
查找所有 package.json
文件并将它们合并到一个文件中?据我所知,以下代码片段是附加文件:
find ../../projects -maxdepth 4 -type f -name "package.json" \
-exec cat {} + | jq -s . > $(CURDIR)/node/.tmp/package.json
我尝试过使用“add”,但这似乎每次都会覆盖目标而不合并两者。
我的项目结构最初如下所示:
\ projects
\ webapp
\ package.json
\ service
\ package.json
\ admin
\ package.json
\ solutions
\ killersolution
Makefile
\ node
在make prenode
之后应该看起来像这样(见下文):
\ projects
\ webapp
\ package.json
\ service
\ package.json
\ admin
\ package.json
\ solutions
\ killersolution
Makefile
\ node
\ .tmp
\ package.json <- created
我正在使用 Makefile
来启动此操作:
prenode:
@find ./node -type d -name ".tmp" -exec rm -rf {} +;
@mkdir -p ./node/.tmp
@find ../../solutions -maxdepth 4 -type f -name "package.json" -exec cat {} + ...
编辑#1:示例输入和输出
让我们假设找到 3 个 package.json
文件。 dependency
和 devDependency
不同,但必须组合起来:
找到文件 #1 ...
{
"name":"project-a",
"dependencies":{
"module-a":"1.2.3"
}
}
找到文件 #2 ...
{
"name":"project-b",
"dependencies":{
"module-b":"2.3.4"
}
}
找到文件 #3 ...
{
"name":"project-c",
"devDependencies":{
"gulp":"*"
}
}
...将全部组合起来形成以下文件:
{
"name":"project-c",
"dependencies":{
"module-a":"1.2.3",
"module-b":"2.3.4"
},
"devDependencies":{
"gulp":"*"
}
}
*注意:
最终输出文件中的 name
属性是无关紧要的。这里的关键是 dependency
和 devDependencies
对象的合并。
最佳答案
假设以下查找命令适合您(如有必要,请调整)
find ../../projects -name package.json
这是一个解决方案,它使用 jq *
运算符以及 reduce 和 -s
选项来合并对象:
jq -s 'reduce .[] as $d ({}; . *= $d)' $(find ../../projects -name package.json)
如果您愿意,您可以轻松连接文件并将它们发送到 jq
find ../../projects -name package.json -exec cat {} \; | \
jq -M -s 'reduce .[] as $d ({}; . *= $d)'
正如我在回复您的评论时所指出的,如果您在 makefile 中执行此操作,则需要采取额外的步骤来处理 $ 或将过滤器放入文件中并使用 -f
关于json - 在 bash 中使用 jq 查找并合并所有 package.json 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45681136/