Files

78 lines
3.5 KiB
Python
Raw Permalink Normal View History

# -*- 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)