file-organize-ima
技能描述
本地文件库去重 + IMA知识库自动分类整理技能。
扫描指定目录,检测文件名重复,按IMA知识库分类名称智能映射并整理目录结构。
面向有大量工程文件需要整理入库的用户。
触发词:「整理文件夹」「文件去重」「IMA分类整理」「按知识库分类」「新建文件夹整理」「文件库整理」「重复文件清理」「批量归类」。
SOP 标准操作流程
阶段 0:准备确认
在执行任何操作前,向用户确认:
- 目标目录:默认
E:\新建文件夹,用户可自定义 - IMA知识库列表:默认
E:\IMA知识库\IMA知识库完整列表.md - 重复文件判断标准:文件名相同(不含路径)
- 保留策略:优先保留最新(LastWriteTime),若相同则保留最大(Length)
- 分类目标路径:整理后文件存放于目标目录内各IMA分类子文件夹
⚠️ 必须提前告知用户:本技能涉及文件移动(不可逆),执行前生成只读报告供用户确认。
阶段 1:重复文件检测(只读)
目标:生成重复文件报告,不删除任何文件。
1.1 编写并运行扫描脚本
创建 duplicate_check.py,逻辑如下:
# 伪代码逻辑
1. 使用 os.walk() 递归遍历目标目录,收集所有文件
2. 按文件名(basename)分组
3. 找出文件名出现 > 1 次的分组(即重复组)
4. 对每组:按 mtime 降序 → size 降序 排列
5. 第一个文件 = 保留;其余文件 = 待删除
6. 输出 duplicate_report.json(含每组详情)和 files_to_delete.json(扁平列表)
7. 统计:总文件数、重复组数、重复文件数、可释放空间
关键注意:
- 脚本开头加
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")解决 Windows GBK 编码 - 运行时用
python -X utf8 duplicate_check.py
1.2 展示报告摘要
展示以下信息:
- 总文件数、重复组数、重复文件数、可释放磁盘空间
- 按文件类型统计(.doc/.pdf/.dwg/.xls 等)
- 前 20 个待删除文件示例
1.3 等待用户确认
⚠️ 此操作非常危险,可能导致不可逆的数据丢失!
必须等待用户明确输入确认语才能进入阶段 2。
阶段 2:删除重复文件
前提:用户已明确确认。
2.1 安装依赖
pip install send2trash -q
2.2 执行删除脚本
创建 delete_duplicates.py,逻辑如下:
# 伪代码逻辑
1. 读取 files_to_delete.json
2. 分批处理(每批 10 个文件)
3. 对每个文件:
a. 检查 os.path.exists()
b. 存在则 send2trash.send2trash(path)
c. 不存在则记录为"跳过(文件不存在)"
4. 每批后打印进度
5. 最终输出:成功/跳过/失败 统计
6. 写入 delete_log.txt
运行:python -X utf8 delete_duplicates.py
2.3 验证清理效果
重新运行 duplicate_check.py,确认重复文件数为 0。
💡 经验:如果发现"文件全部不存在",说明其他进程(云同步、上传工具)已提前处理,属正常现象,直接验证即可。
阶段 3:IMA知识库分类整理(只读报告)
目标:将目标目录下的一级子目录映射到IMA知识库分类,生成报告。
3.1 读取IMA知识库分类列表
从 E:\IMA知识库\IMA知识库完整列表.md 中提取所有知识库分类名称(通常为 ## 标题行)。
3.2 构建关键词映射字典
# 从IMA分类名称中提取关键词
# 例:「安全管理之动火作业」→ 关键词:['安全', '动火', '作业']
# 例:「钢结构及幕墙工程智库」→ 关键词:['钢结构', '幕墙']
关键词提取策略:
- 去除「之」「及」「与」「智库」「合集」「资料」「大全」等停用词
- 保留核心专业词汇(长度 ≥ 2 个汉字)
3.3 目录名匹配
# 对每个子目录名:
1. 尝试精确包含匹配(目录名包含 IMA 分类关键词)
2. 或 IMA 分类名包含目录名关键词
3. 按匹配置信度排序,取最高分匹配
4. 无匹配 → 归入「【未分类】」
3.4 生成分类报告
输出 classify_report.json,格式:
{
"matched": [
{
"source_dir": "钢筋工程量计算资料合集",
"target_ima": "工程量计算智能库",
"confidence": "high",
"match_keyword": "工程量"
}
],
"unmatched": ["张雪峰资源", "台州市国际科学家创业基地..."],
"summary": {
"total": 334,
"matched": 207,
"unmatched": 127
}
}
阶段 4:执行分类移动
前提:用户确认分类报告无误。
4.1 执行移动脚本
创建 move_to_ima.py,逻辑如下:
# 伪代码逻辑
1. 读取 classify_report.json
2. 对每个 matched 条目:
a. 源路径 = 目标目录 / source_dir
b. 目标路径 = 目标目录 / target_ima / source_dir
c. 创建目标父目录(os.makedirs)
d. shutil.move(src, dst)
e. 记录到 move_log.txt
3. 对每个 unmatched 条目:
a. 目标路径 = 目标目录 / 【未分类】 / source_dir
b. shutil.move(src, dst)
4. 打印最终统计
运行:python -X utf8 move_to_ima.py
4.2 验证整理结果
Get-ChildItem 'E:\新建文件夹' -Directory | Select-Object Name | Sort-Object Name
预期:顶层目录由 200+ 个减少为 IMA分类数+1(【未分类】)。
阶段 5:后续处理建议
- 【未分类】目录:人工审查,对有规律的目录补充关键词映射后再次运行分类
- IMA知识库同步:整理完毕后,将分类后的文件夹同步至 IMA 知识库
- 清空回收站:确认整理无误后,清空回收站释放磁盘空间
脚本文件清单
| 文件名 | 作用 |
|---|---|
duplicate_check.py |
重复文件检测,生成 duplicate_report.json + files_to_delete.json |
show_delete_report.py |
展示待删除文件详细统计报告 |
delete_duplicates.py |
分批删除重复文件(send2trash 移至回收站) |
classify_files.py |
IMA分类智能映射,生成 classify_report.json |
move_to_ima.py |
按分类报告执行目录移动,生成 move_log.txt |
所有脚本工作目录:D:\1052-os\skills\file-organize-ima\scripts\
图片分类脚本工作目录:D:\1052-os\skills\file-organize-ima\scripts\
踩坑经验
Windows 编码问题
- 现象:PowerShell / Python 在 Windows 命令行输出中文报
UnicodeEncodeError或乱码 - 解决:
- Python 脚本开头加:
import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") - 运行命令使用
python -X utf8 script.py - 避免在 print 中使用 emoji(⚠️ 等)
- Python 脚本开头加:
路径过长问题
- 现象:Windows 默认路径限制 260 字符,深层嵌套目录会报错
- 解决:Python 路径前缀加
\\\\?\\(仅 Win32 API),或在注册表开启长路径支持
目录自移问题
- 现象:IMA分类名与目录名相同(如「市政工程方案」),移动目标 = 自身,报错
- 解决:移动前检查
src == dst,跳过并记录为"无需移动"
重复文件路径失效
- 现象:扫描时存在,执行删除时全部显示"不存在"
- 原因:云同步/上传工具在扫描期间已并发处理了这些文件
- 解决:重新扫描确认实际状态,不必强制重试删除
PowerShell 脚本编码
- 现象:PowerShell 脚本处理大量文件时中文输出乱码
- 建议:大批量文件处理优先使用 Python 而非 PowerShell,编码更可控
本次执行记录(2026-05-03)
- 目标目录:
E:\新建文件夹 - 文件总量:153,488 个文件(首次扫描),重新扫描后 102,908 个
- 重复文件:18,206 组 / 50,580 个(已自动清理,可释放约 151.5 GB)
- IMA分类:195 个知识库分类,334 个目录参与匹配
- 匹配结果:207 个已匹配 → 归入 43 个 IMA 分类文件夹;127 个未匹配 → 【未分类】
- 整理后结构:44 个顶层目录(43 个 IMA 分类 + 1 个【未分类】)
图片智能分类(新增功能)
将混合图片按内容自动分类:施工类 / 风景类 / 人物类 / 动物类 / 微信截图 / 文字照片 / 网址照片
触发词
「图片分类」「照片整理」「批量分类图片」「按内容分类照片」「清理文字照片」「清理网址截图」
分类规则
| 分类 | 判断依据 | 后续处理 |
|---|---|---|
| 微信截图 | 长宽比 > 2.5 或文件名含"截图""Screenshot" | 移动到 微信截图/ |
| 文字照片 | OCR识别文字行数 ≥ 5 行 | 提取文字→保存为同名.txt→删除原图 |
| 网址照片 | OCR识别内容含 http/https/www. |
提取URL→保存为同名.txt→删除原图 |
| 施工类 | 多模态模型判断为施工/工程/建筑场景 | 按拍摄时间重命名→移动到 施工类/ |
| 风景类 | 多模态模型判断为风景/自然场景 | 移动到 风景类/ |
| 人物类 | 多模态模型判断为人物/人像 | 移动到 人物类/ |
| 动物类 | 多模态模型判断为动物/宠物 | 移动到 动物类/ |
多模态模型配置
脚本同级目录创建 image_classify_config.json:
{
"provider": "qwen",
"api_key": "your-api-key",
"api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "qwen-vl-max"
}
支持提供商:qwen(推荐)/ deepseek / openai / local_clip(本地免API)
SOP 标准操作流程
阶段0:准备确认
- 图片目录:默认
C:\Users\19586\Desktop - 是否删除文字/网址照片原图:默认是
- 施工类时间排序:优先EXIF拍摄时间,无则文件修改时间
- 检查
image_classify_config.json是否配置
阶段1:OCR快速分类
- 遍历所有图片,调用百度OCR获取文字
- 含http/https/www. → 网址照片
- 文字行数 ≥ 5 → 文字照片
- 长宽比 > 2.5 → 微信截图
- 文字/网址照片:提取内容保存为同名.txt,删除原图
- 微信截图:移动到
微信截图/目录
阶段2:多模态模型分类
- 对剩余图片调用多模态模型
- Prompt:
请判断这张图片属于以下哪一类,只回复类别名称:施工类、风景类、人物类、动物类 - 结果归入对应分类目录
阶段3:施工类按时间排序重命名
- 读取EXIF拍摄时间(DateTimeOriginal)
- 无EXIF则用文件修改时间
- 按时间升序重命名为:
施工_20260415_001.jpg
阶段4:生成报告 → 用户确认 → 执行
脚本文件清单(新增)
| 文件名 | 作用 |
|---|---|
image_classify_config.json |
多模态模型API配置 |
image_classify.py |
图片智能分类主脚本(OCR+多模态) |
extract_text_from_images.py |
批量OCR提取图片文字保存为txt |
踩坑经验(图片分类专项)
- 百度OCR限流:每次请求后
time.sleep(0.5)限流,或改用批量OCR接口 - EXIF时间缺失:微信转发/截图丢失EXIF,降级使用文件LastWriteTime并提示用户
- 多模态误分类:优先规则 — OCR文字/网址 → 微信截图 → 多模态分类;含塔吊/安全帽强制归施工类
- 中文路径编码:用
pathlib.Path代替open();百度OCR用base64传输不经过文件路径 - 保留原图选项:配置
"delete_after_extract": false关闭删除
本次图片分类执行记录(待填写)
- 目标目录:
- 图片总量:
- 分类结果:
- 已提取文字照片:
- 已删除原图:
- 施工类时间排序: