如何用Bash全局递增多个JSON文件中的id字段?
解决多JSON文件全局递增ID的问题
原脚本的问题
你的现有脚本存在两个核心问题:
- 管道触发的
while循环会创建子shell,循环内修改的计数器i无法传递到外部,切换文件时计数器会重置 - jq的写法错误,把当前文件所有对象的
id都设为同一个i值,没有实现逐个对象递增
修正后的脚本
下面是能实现全局连续递增ID的脚本,同时会自动备份原文件:
#!/bin/bash # 初始化全局起始ID current_id=1 # 遍历所有子文件夹中的JSON文件(排除当前脚本自身),按文件名排序保证处理顺序稳定 while read -r file; do echo "正在处理: $file" # 先备份原文件,防止修改出错 cp "$file" "$file.bak" # 获取当前文件中对象数组的长度 obj_count=$(jq 'length' "$file") # 修改每个对象的id,从current_id开始逐个递增 jq --argjson start "$current_id" ' range(length) as $index | .[$index].id = $start + $index ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" # 更新全局计数器,为下一个文件准备起始ID ((current_id += obj_count)) done < <(find . -type f -name "*.json" ! -name "${0##*/}" | sort)
脚本工作原理
- 全局计数器:
current_id从1开始,作为所有文件的ID起始值 - 文件遍历:用
find精准定位所有.json文件,排除脚本自身;sort保证文件处理顺序固定(可根据需求调整排序规则) - 备份机制:处理每个文件前先复制备份,避免意外损坏原数据
- ID赋值:通过jq的
range(length)遍历数组索引,给每个对象的id赋值为起始ID + 索引,确保同一文件内ID连续递增 - 计数器更新:处理完一个文件后,把该文件的对象数量加到
current_id上,保证下一个文件的ID从全局连续的数值开始
测试效果
用你的示例文件测试:
- 处理
file1.json后,id保持1、2,current_id变为3 - 处理
file2.json时,id从3开始递增,最终变为3、4,符合你的预期
内容的提问来源于stack exchange,提问作者QAscoop
相关产品推荐
相关产品推荐

