wip: 2026-08-11 工作树快照(docs/memory/h5.py/scripts 等 447 项未评审改动,安全提交到 feat 分支)
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""用 ctypes RemoveDirectoryW 直接删除空目录(绕过 safe-delete 回收站钩子)。"""
|
||||
import os, ctypes, sys
|
||||
|
||||
ROOT = "docs"
|
||||
kernel32 = ctypes.windll.kernel32
|
||||
DRY = "--go" not in sys.argv
|
||||
|
||||
REMAIN = ["09-部署运维", "10-项目管理", "11-历史归档"]
|
||||
|
||||
def norm(d):
|
||||
return os.path.normpath(os.path.join(ROOT, d))
|
||||
|
||||
# 收集所有空目录(含嵌套),按深度降序删除
|
||||
def collect_empty(d):
|
||||
out = []
|
||||
for root, dirs, files in os.walk(d):
|
||||
if not files:
|
||||
# 仅当该目录下无任何文件(子目录稍后递归删空)
|
||||
out.append(root)
|
||||
# 按路径深度降序
|
||||
out.sort(key=lambda p: p.count(os.sep), reverse=True)
|
||||
return out
|
||||
|
||||
all_empty = []
|
||||
for d in REMAIN:
|
||||
dp = norm(d)
|
||||
if os.path.isdir(dp):
|
||||
# 先确认整棵树无文件
|
||||
files = [os.path.join(r, f) for r, _, fs in os.walk(dp) for f in fs]
|
||||
if files:
|
||||
print("!! 非空,跳过:", d, files[:5]); continue
|
||||
all_empty += collect_empty(dp)
|
||||
|
||||
print("待删空目录数:", len(all_empty))
|
||||
if DRY:
|
||||
for p in all_empty:
|
||||
print(" ", p)
|
||||
else:
|
||||
for p in all_empty:
|
||||
lp = ctypes.c_wchar_p(os.path.abspath(p))
|
||||
ok = kernel32.RemoveDirectoryW(lp)
|
||||
if not ok:
|
||||
print("FAIL", p, "err", kernel32.GetLastError())
|
||||
else:
|
||||
print("RM", p)
|
||||
# 最后删顶层(若空)
|
||||
for d in REMAIN:
|
||||
dp = norm(d)
|
||||
if os.path.isdir(dp):
|
||||
lp = ctypes.c_wchar_p(os.path.abspath(dp))
|
||||
kernel32.RemoveDirectoryW(lp)
|
||||
print("DONE")
|
||||
Reference in New Issue
Block a user