52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
||
|
|
"""对 24 个残留旧引用,尝试在当前新结构里找近似等价文件。"""
|
||
|
|
import os, re, collections
|
||
|
|
|
||
|
|
ROOT = "docs"
|
||
|
|
OLD_DIRS = ["02-产品需求", "03-技术架构", "04-原型设计",
|
||
|
|
"09-部署运维", "10-项目管理", "01-产品设计", "06-测试质量"]
|
||
|
|
|
||
|
|
# 当前 docs 全部文件相对路径
|
||
|
|
allfiles = []
|
||
|
|
for root, _, fs in os.walk(ROOT):
|
||
|
|
for f in fs:
|
||
|
|
rel = os.path.relpath(os.path.join(root, f), ROOT).replace(os.sep, '/')
|
||
|
|
allfiles.append(rel)
|
||
|
|
|
||
|
|
pat = re.compile(r'(?:%s)/[^\s\)\]]+' % '|'.join(OLD_DIRS))
|
||
|
|
residual = {} # basename -> oldref (去尾反引号)
|
||
|
|
for root, _, fs in os.walk(ROOT):
|
||
|
|
for f in fs:
|
||
|
|
if not f.endswith('.md'):
|
||
|
|
continue
|
||
|
|
with open(os.path.join(root, f), encoding='utf-8') as fh:
|
||
|
|
for line in fh:
|
||
|
|
for m in pat.finditer(line):
|
||
|
|
oldref = m.group(0).rstrip('`')
|
||
|
|
bn = oldref.split('/')[-1]
|
||
|
|
residual.setdefault(bn, oldref)
|
||
|
|
|
||
|
|
def candidates(bn):
|
||
|
|
# 关键词:去掉版本/日期/扩展名,取核心词
|
||
|
|
core = re.sub(r'[-_ ]?(v?\d+\.\d+.*|2026\d\d\d\d|\d{8}|备份|archived).*$', '', bn)
|
||
|
|
core = core.replace('.md', '').replace('.html', '')
|
||
|
|
# 取连续中文/英文关键词片段
|
||
|
|
keys = [k for k in re.split(r'[-_ ]', core) if len(k) >= 2]
|
||
|
|
hits = []
|
||
|
|
for af in allfiles:
|
||
|
|
afb = af.split('/')[-1]
|
||
|
|
if bn == afb:
|
||
|
|
continue
|
||
|
|
if any(k.lower() in afb.lower() for k in keys if len(k) >= 3):
|
||
|
|
hits.append(af)
|
||
|
|
return hits[:5]
|
||
|
|
|
||
|
|
print("残留 basename 数:", len(residual))
|
||
|
|
for bn, oldref in sorted(residual.items()):
|
||
|
|
if bn in ('', '`'):
|
||
|
|
continue
|
||
|
|
c = candidates(bn)
|
||
|
|
print("\n● %s" % bn)
|
||
|
|
print(" 旧: %s" % oldref)
|
||
|
|
print(" 候选(新结构): " + ("; ".join(c) if c else "*** 无近似文件(确属死链) ***"))
|