# File Organize Ima

> file-organize-ima

- Skill: `whb786200/file-organize-ima` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add whb786200/file-organize-ima`
- Raw SKILL.md: https://api.skillmd.com/api/skills/whb786200/file-organize-ima/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: whb786200 (https://skillmd.com/u/whb786200)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/whb786200/file-organize-ima

---

# file-organize-ima

## 技能描述

本地文件库去重 + IMA知识库自动分类整理技能。  
扫描指定目录，检测文件名重复，按IMA知识库分类名称智能映射并整理目录结构。  
面向有大量工程文件需要整理入库的用户。

触发词：「整理文件夹」「文件去重」「IMA分类整理」「按知识库分类」「新建文件夹整理」「文件库整理」「重复文件清理」「批量归类」。

---

## SOP 标准操作流程

### 阶段 0：准备确认

在执行任何操作前，向用户确认：
1. **目标目录**：默认 `E:\新建文件夹`，用户可自定义
2. **IMA知识库列表**：默认 `E:\IMA知识库\IMA知识库完整列表.md`
3. **重复文件判断标准**：文件名相同（不含路径）
4. **保留策略**：优先保留最新（LastWriteTime），若相同则保留最大（Length）
5. **分类目标路径**：整理后文件存放于目标目录内各IMA分类子文件夹

> ⚠️ **必须提前告知用户**：本技能涉及文件移动（不可逆），执行前生成只读报告供用户确认。

---

### 阶段 1：重复文件检测（只读）

**目标**：生成重复文件报告，不删除任何文件。

#### 1.1 编写并运行扫描脚本

创建 `duplicate_check.py`，逻辑如下：

```python
# 伪代码逻辑
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 安装依赖

```bash
pip install send2trash -q
```

#### 2.2 执行删除脚本

创建 `delete_duplicates.py`，逻辑如下：

```python
# 伪代码逻辑
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 构建关键词映射字典

```python
# 从IMA分类名称中提取关键词
# 例：「安全管理之动火作业」→ 关键词：['安全', '动火', '作业']
# 例：「钢结构及幕墙工程智库」→ 关键词：['钢结构', '幕墙']
```

关键词提取策略：
- 去除「之」「及」「与」「智库」「合集」「资料」「大全」等停用词
- 保留核心专业词汇（长度 ≥ 2 个汉字）

#### 3.3 目录名匹配

```python
# 对每个子目录名：
1. 尝试精确包含匹配（目录名包含 IMA 分类关键词）
2. 或 IMA 分类名包含目录名关键词
3. 按匹配置信度排序，取最高分匹配
4. 无匹配 → 归入「【未分类】」
```

#### 3.4 生成分类报告

输出 `classify_report.json`，格式：
```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`，逻辑如下：

```python
# 伪代码逻辑
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 验证整理结果

```powershell
Get-ChildItem 'E:\新建文件夹' -Directory | Select-Object Name | Sort-Object Name
```

预期：顶层目录由 200+ 个减少为 IMA分类数+1（【未分类】）。

---

### 阶段 5：后续处理建议

1. **【未分类】目录**：人工审查，对有规律的目录补充关键词映射后再次运行分类
2. **IMA知识库同步**：整理完毕后，将分类后的文件夹同步至 IMA 知识库
3. **清空回收站**：确认整理无误后，清空回收站释放磁盘空间

---

## 脚本文件清单

| 文件名 | 作用 |
|--------|------|
| `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` 或乱码
- **解决**：
  1. Python 脚本开头加：
     ```python
     import sys, io
     sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
     ```
  2. 运行命令使用 `python -X utf8 script.py`
  3. 避免在 print 中使用 emoji（⚠️ 等）

### 路径过长问题
- **现象**：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`：

```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` 关闭删除

### 本次图片分类执行记录（待填写）

- **目标目录**：
- **图片总量**：
- **分类结果**：
- **已提取文字照片**：
- **已删除原图**：
- **施工类时间排序**：

