78 lines
3.5 KiB
Python
78 lines
3.5 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""二次验证:按内容 hash(忽略文件名)判断旧目录文件是否已存在于新结构;并比较同名文件的新旧时间。"""
|
|||
|
|
import os, hashlib, json, collections, datetime
|
|||
|
|
|
|||
|
|
ROOT = r"D:\资料\03-项目开发\wecom_it_smart_desk\docs"
|
|||
|
|
OLD = ["01-产品设计","02-产品需求","03-技术架构","04-原型设计","06-测试质量","08-安全审计","09-部署运维","10-项目管理","11-历史归档"]
|
|||
|
|
NEW = ["01-产品文档","02-技术文档","03-测试文档","04-运维文档","05-运营文档","06-安全审计","07-项目管理","08-历史归档"]
|
|||
|
|
OLD_ROOT_FILES = ["class-diagram.mermaid","sequence-diagram.mermaid","system_design.md"]
|
|||
|
|
|
|||
|
|
def h(p):
|
|||
|
|
return hashlib.md5(open(p,'rb').read()).hexdigest()
|
|||
|
|
|
|||
|
|
def mt(p):
|
|||
|
|
return datetime.datetime.fromtimestamp(os.path.getmtime(p)).strftime("%Y-%m-%d %H:%M")
|
|||
|
|
|
|||
|
|
# 新结构:content-hash -> [relpath],name -> [(relpath,hash)]
|
|||
|
|
hash2new = collections.defaultdict(list)
|
|||
|
|
name2new = collections.defaultdict(list)
|
|||
|
|
for d in NEW:
|
|||
|
|
base = os.path.join(ROOT, d)
|
|||
|
|
if not os.path.isdir(base): continue
|
|||
|
|
for dp, dn, fn in os.walk(base):
|
|||
|
|
for f in fn:
|
|||
|
|
fp = os.path.join(dp, f)
|
|||
|
|
hh = h(fp)
|
|||
|
|
rel = os.path.relpath(fp, ROOT)
|
|||
|
|
hash2new[hh].append(rel)
|
|||
|
|
name2new[f].append((rel, hh))
|
|||
|
|
|
|||
|
|
oldfiles = []
|
|||
|
|
for d in OLD + OLD_ROOT_FILES:
|
|||
|
|
base = os.path.join(ROOT, d)
|
|||
|
|
if os.path.isdir(base):
|
|||
|
|
for dp, dn, fn in os.walk(base):
|
|||
|
|
for f in fn:
|
|||
|
|
oldfiles.append(os.path.join(dp,f))
|
|||
|
|
elif os.path.isfile(base):
|
|||
|
|
oldfiles.append(base)
|
|||
|
|
|
|||
|
|
content_dup = [] # 内容已在新结构中(含改名)
|
|||
|
|
name_diff = [] # 同名不同内容
|
|||
|
|
truly_missing = [] # 内容+文件名都不在新结构
|
|||
|
|
|
|||
|
|
for fp in oldfiles:
|
|||
|
|
rel = os.path.relpath(fp, ROOT)
|
|||
|
|
bn = os.path.basename(fp)
|
|||
|
|
hh = h(fp)
|
|||
|
|
if hh in hash2new:
|
|||
|
|
content_dup.append((rel, hash2new[hh][0]))
|
|||
|
|
elif bn in name2new:
|
|||
|
|
cands = name2new[bn]
|
|||
|
|
newest = cands[0][0]
|
|||
|
|
name_diff.append((rel, mt(fp), os.path.getsize(fp), newest, mt(os.path.join(ROOT,newest)), os.path.getsize(os.path.join(ROOT,newest))))
|
|||
|
|
else:
|
|||
|
|
truly_missing.append((rel, mt(fp), os.path.getsize(fp)))
|
|||
|
|
|
|||
|
|
print("旧目录文件总数:", len(oldfiles))
|
|||
|
|
print("A. 内容已存在于新结构(含改名迁移,可安全删除):", len(content_dup))
|
|||
|
|
print("B. 同名但内容不同(需判定哪边权威):", len(name_diff))
|
|||
|
|
print("C. 内容与文件名均不在新结构(疑似唯一,需人工确认):", len(truly_missing))
|
|||
|
|
|
|||
|
|
print("\n===== B. 同名内容不同:旧 vs 新(时间/大小) =====")
|
|||
|
|
print(f"{'旧路径':<62} {'旧时间':<17}{'旧KB':>7} | {'新路径':<58} {'新时间':<17}{'新KB':>7}")
|
|||
|
|
newer_in_new = 0
|
|||
|
|
for a, amt, asz, b, bmt, bsz in name_diff:
|
|||
|
|
flag = "新更新" if bmt > amt else ("旧更新" if amt > bmt else "同时间")
|
|||
|
|
if bmt >= amt: newer_in_new += 1
|
|||
|
|
print(f"{a:<62} {amt:<17}{asz/1024:>7.1f} | {b:<58} {bmt:<17}{bsz/1024:>7.1f} {flag}")
|
|||
|
|
print(f"\n其中新结构版本更新或同时间的: {newer_in_new}/{len(name_diff)}")
|
|||
|
|
|
|||
|
|
print("\n===== C. 疑似唯一文件(内容不在新结构任何位置) =====")
|
|||
|
|
for rel, m, s in truly_missing:
|
|||
|
|
print(f" - {rel:<70} {m} {s/1024:.1f}KB")
|
|||
|
|
|
|||
|
|
json.dump({"content_dup":content_dup,"name_diff":name_diff,"truly_missing":truly_missing},
|
|||
|
|
open(r"D:\资料\03-项目开发\wecom_it_smart_desk\docs_cmp_result2.json","w",encoding="utf-8"),
|
|||
|
|
ensure_ascii=False, indent=1)
|