如何批量读取多目录JSON文件压缩后回写至对应原文件
问题原因
你当前使用的命令只会将所有匹配到的JSON文件内容拼接后,统一压缩输出到终端标准输出,既不会将处理结果按原文件拆分,也没有回写原文件的逻辑,因此无法实现预期效果。
可行解决方案
方案1:单文件独立处理(兼容性最好)
直接通过find的exec参数对每个文件单独处理,核心是要先输出到临时文件再覆盖原文件,避免直接重定向清空原文件导致内容丢失:
find . -type f -name '*.json' -exec bash -c 'jq -c "." "$1" > "$1.tmp" && mv "$1.tmp" "$1"' _ {} \;
方案2:批量高效处理(适合文件数量多的场景)
配合xargs减少进程创建开销,同时使用-print0和-0参数兼容带空格、特殊字符的文件名:
find . -type f -name '*.json' -print0 | xargs -0 -I {} bash -c 'jq -c "." "{}" > "{}.tmp" && mv "{}.tmp" "{}"'
注意事项
- 担心操作失误损坏原文件的话,可以增加备份逻辑,处理前先把原文件备份为
.bak后缀:
需要恢复备份时执行以下命令即可:find . -type f -name '*.json' -exec bash -c 'cp "$1" "$1.bak" && jq -c "." "$1" > "$1.tmp" && mv "$1.tmp" "$1"' _ {} \;find . -name '*.json.bak' -exec bash -c 'mv "$1" "${1%.bak}"' _ {} \; - 正式回写前可以先执行以下命令预览处理结果,确认所有JSON格式合法、输出符合预期后再执行回写操作:
find . -type f -name '*.json' -exec echo "处理文件:{}" \; -exec jq -c "." {} \;
内容的提问来源于stack exchange,提问作者user14645176
相关产品推荐
相关产品推荐

