dedupe-archive.mjs 1.3 KB

1234567891011121314151617181920212223242526272829
  1. // 去重:同一 AI 底图的多份副本只保留最高分辨率一份,其余删除并在索引留痕
  2. import { readFileSync, writeFileSync, unlinkSync } from 'node:fs'
  3. import { join } from 'node:path'
  4. const dir = '.scratch/lanhu-cockpit-asset-replacement/design-archive'
  5. const idx = JSON.parse(readFileSync(join(dir, 'index.json'), 'utf8'))
  6. const baseMaps = idx.files.filter((f) => f.layer && f.layer.includes('ChatGPT Image'))
  7. baseMaps.sort((a, b) => b.bytes - a.bytes)
  8. const keep = baseMaps[0]
  9. const dropped = []
  10. for (const f of baseMaps) {
  11. if (f === keep) continue
  12. unlinkSync(join(dir, f.local))
  13. dropped.push({ local: f.local, artboard: f.artboard, w: f.w, h: f.h, bytes: f.bytes, sha256: f.sha256, reason: 'duplicate-base-map' })
  14. }
  15. const kept = idx.files.filter((f) => !dropped.some((d) => d.local === f.local))
  16. idx.files = kept
  17. idx.dropped = dropped
  18. idx.note = '同一 AI 生成底图的多份副本仅保留最高分辨率一份,其余删除并在此留痕(内容不同字节但视觉相同)'
  19. idx.count = kept.length
  20. writeFileSync(join(dir, 'index.json'), JSON.stringify(idx, null, 1))
  21. console.log('kept:', keep.local, `${keep.w}x${keep.h}`, keep.bytes)
  22. console.log('dropped:', dropped.length)
  23. for (const d of dropped) console.log(` - ${d.local} ${d.w}x${d.h}`)
  24. console.log('files kept:', kept.length)