You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

脚本工作原理

  1. 全局计数器:current_id从1开始,作为所有文件的ID起始值
  2. 文件遍历:用find精准定位所有.json文件,排除脚本自身;sort保证文件处理顺序固定(可根据需求调整排序规则)
  3. 备份机制:处理每个文件前先复制备份,避免意外损坏原数据
  4. ID赋值:通过jq的range(length)遍历数组索引,给每个对象的id赋值为起始ID + 索引,确保同一文件内ID连续递增
  5. 计数器更新:处理完一个文件后,把该文件的对象数量加到current_id上,保证下一个文件的ID从全局连续的数值开始

测试效果

用你的示例文件测试:

  • 处理file1.json后,id保持1、2,current_id变为3
  • 处理file2.json时,id从3开始递增,最终变为3、4,符合你的预期

内容的提问来源于stack exchange,提问作者QAscoop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:15:28