# File Organizer

> 基于 AI 语义分析的智能文件整理技能，根据文件内容动态创建 Johnny Decimal 分类。 当用户提到以下内容时触发： - "整理文件"、"分类文件"、"组织下载"、"文件归档" - "文件太多了"、"下载文件夹很乱"、"文件乱七八糟" - "把文件按类别整理"、"自动分类文件" - "清理下载文件夹"、"整理文档" - "文件管理"、"文件分类整理" - 提到需要将文件从一个目录移动到另一个目录进行分类 核心功能： - AI 分析文件名语义，动态生成分类 - 使用 Johnny Decimal 编号系统（XX.YY 格式） - 自动检测重复文件（MD5 算法） - 用户确认分类计划后再执行

- Skill: `luokai0/file-organizer` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add luokai0/file-organizer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/luokai0/file-organizer/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: luokai0 (https://skillmd.com/u/luokai0)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/luokai0/file-organizer

---


# File Organizer Skill

基于 AI 语义分析的智能文件整理技能，根据文件内容动态创建分类。

## 核心特性

| 特性 | 说明 |
|------|------|
| **分类方式** | AI 分析文件名语义，动态生成分类 |
| **交互模式** | AskUserQuestion 询问源/目标目录 |
| **用户确认** | 显示分类计划后等待确认 |
| **目标优先** | 优先使用目标目录现有分类 |
| **重复检测** | 使用 MD5 算法自动检测重复文件 |

## 使用方式

本技能通过自然语言触发，你可以用多种方式描述需求：

**示例：**
- "把我的 Downloads 文件夹整理到 Documents/Archives"
- "我的下载文件夹太乱了，帮我按类别整理一下"
- "整理这些文件：~/Downloads → ~/Documents/Organized"
- "清理下载文件夹，把文件按类型分类"

**如果需要指定特定目录：**
- 可以在对话中直接提供路径
- 技能会通过 `AskUserQuestion` 询问源目录和目标目录
- 支持绝对路径和相对路径（如 `~/Downloads`, `./files`）

## Johnny Decimal 分类标准

本技能使用 Johnny Decimal 编号系统进行文件分类。详细规范请参考：`references/johnny_decimal.md`

**核心要点：**
- 使用 `XX.YY` 格式的分类编号（如 `01-01`, `10-05`）
- 主编号按主题领域递增（如 `01-XX` 技术类，`02-XX` 商业类）
- 子编号在同一领域内按顺序递增
- 分类命名格式：`编号_类别名称`

**快速示例：**
```
01-01_人工智能技术    # 技术领域
01-02_网络安全        # 技术领域
01-03_编程开发        # 技术领域
02-01_金融经济        # 商业领域（新主题，主编号递增）
02-02_消费零售        # 商业领域
```

## 执行流程

### 1. 解析参数
检查用户是否提供了源目录和目标目录参数。

### 2. 确定源目录（如未指定）
使用 `AskUserQuestion` 询问用户，提供常用目录选项。

### 3. 确定目标目录（如未指定）
使用 `AskUserQuestion` 询问用户，提供常用目录选项。

### 4. 扫描目标目录
```bash
ls -la "$target"
```
- 检查是否已有分类目录
- 如有，记录现有分类列表供后续匹配

### 5. 扫描源文件
```bash
ls -1 "$source"
```
- 获取所有文件列表
- 跳过隐藏文件（以 `.` 开头）

### 6. AI 分析并生成分类

**如果目标目录有分类**：将文件匹配到现有分类

**如果目标目录无分类**：AI 分析所有文件名，动态创建分类

**重要：生成的分类名称必须带编号前缀，格式为 `编号_类别名称`**
- 编号使用 Johnny Decimal 格式：`01-01`, `01-02`, `02-01`, `10-05` 等
- 编号与类别名称之间用下划线 `_` 分隔
- 类别名称可以使用中文或英文，允许包含下划线

**编号递增规则（关键）：**
- **主分类编号（第一部分）**：根据**主题领域**递增
  - 同一大类主题下的所有子分类共享相同的主分类编号
  - 例如：所有技术相关用 `01-XX`，所有商业相关用 `02-XX`，所有行业相关用 `03-XX`
  - 每个主分类编号最多包含 99 个子分类（`01-01` 到 `01-99`）
  - 当发现不同的主题领域时，必须递增主分类编号
- **子分类编号（第二部分）**：在同一主题领域内按顺序递增（`01`, `02`, `03`...）

**示例：**
```
01-01_人工智能技术    # 技术领域
01-02_网络安全        # 技术领域
01-03_编程开发        # 技术领域
02-01_金融经济        # 商业领域（新主题，主编号递增）
02-02_消费零售        # 商业领域
02-03_商业管理        # 商业领域
03-01_教育培训        # 行业领域（新主题，主编号再递增）
03-02_医疗健康        # 行业领域
```

分类原则：
- 根据文件名的语义相似性分组
- **先识别主题领域**（技术/商业/行业/娱乐等），再细分具体类别
- 分类名称简洁明了（中文或英文）
- 每个分类包含相关联的文件
- 优先识别常见模式（代码、文档、图片、压缩包等）

### 7. 显示分类计划

根据步骤 6 生成的分类，向用户展示整理计划。

**显示策略：**
- **文件总数 ≤ 30**：显示完整文件列表（当前模式）
- **文件总数 > 30**：智能摘要模式
  - 显示：分类名称 + 文件数量 + 前 3 个代表性文件
  - 提供：`[展开查看全部]` 选项

**统计文件总数（Bash）：**
```bash
total_files=$(ls -1 "$source" | wc -l | tr -d ' ')
```

**示例格式（使用实际变量）：**

**模式 A：完整列表（≤30 个文件）**
```
📁 源目录: $source (13 个文件)
📂 目标目录: $target (新建分类)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  📚 01-01_学习资料 (3 files)
     ├── 学习笔记Python.pdf
     ├── 课程视频.mp4
     └── 教程.md
  💻 01-02_代码项目 (2 files)
     ├── React组件.tsx
     └── script.py
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

**模式 B：智能摘要（>30 个文件）**
```
📁 源目录: $source (127 个文件)
📂 目标目录: $target (新建分类)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  📚 01-01_学习资料 (45 files)  [展开查看全部]
     ├── 学习笔记Python.pdf
     ├── 课程视频.mp4
     └── 教程.md
     ... 还有 42 个文件
  💻 01-02_代码项目 (38 files)  [展开查看全部]
     ├── React组件.tsx
     ├── script.py
     └── index.html
     ... 还有 35 个文件
  📦 01-03_压缩备份 (44 files)  [展开查看全部]
     ├── backup.zip
     ├── archive.tar.gz
     └── documents.7z
     ... 还有 41 个文件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

💡 提示：文件数量较多，显示为智能摘要模式
```

**注意：** 显示时使用实际的 `$source` 和 `$target` 变量值，不要硬编码路径。

### 8. 用户确认（必须）

使用 `AskUserQuestion` 询问是否执行：

**选项：**
- **确认执行** - 按照上述分类计划移动文件
- **展开查看全部** - 显示完整的文件列表（适用于摘要模式）
- **调整分类** - 修改某些文件的分类
- **取消操作** - 放弃本次整理

**必须等待用户确认后才能执行移动操作**

**模式切换说明：**
- 如果用户在摘要模式下选择"展开查看全部"，重新以完整列表模式显示步骤 7
- 再次确认时，`展开查看全部` 选项替换为 `返回摘要模式`

### 9. 创建目录结构
根据步骤 6 生成的分类，动态创建目录。

**格式：** `$target/编号_类别名称`

示例（根据实际分类动态创建）：
```bash
# 假设 AI 生成的分类为：
# - 01-01_Claude相关
# - 01-02_AI综合应用
# - 01-03_代码项目

mkdir -p "$target/01-01_Claude相关"
mkdir -p "$target/01-02_AI综合应用"
mkdir -p "$target/01-03_代码项目"
```

**注意：** 必须使用 `$target` 变量，不要硬编码路径。

### 10. 执行移动操作
使用 Bash 命令批量移动文件到对应分类目录。

### 11. 重复文件检查与处理

在移动文件完成后，检查目标目录是否存在重复文件。

```bash
# 调用 Python 脚本检查重复文件
python3 scripts/check_duplicates.py "$target"
```

**脚本输出示例：**
```
🔍 重复文件检查报告
============================================================
📂 目标目录: /Users/user/Documents/Archives
📄 总文件数: 45
✅ 唯一文件: 42
🔄 重复组数: 1

⚠️  发现以下重复文件：

MD5: a1b2c3d4e5f6...
  大小: 1,234,567 字节
  ✅ 保留: 01-01_学习资料/document.pdf
       时间: 2025-02-10 14:30:00
  🗑️  重复: 01-02_代码项目/document.pdf
       时间: 2025-02-15 09:20:00
```

**处理重复文件（如果发现重复）：**

使用 `AskUserQuestion` 询问用户处理方式：

**选项：**
- **自动删除重复文件**（保留每组最早创建的文件）
- **保留所有文件**（不做任何修改）
- **查看详细报告**（显示完整 JSON 报告）

**如果选择自动删除：**
```bash
python3 scripts/check_duplicates.py "$target" --delete
```

**删除策略：**
- 每个 MD5 组保留修改时间最早的文件
- 删除其余重复文件
- 显示删除文件数和释放空间

**如果选择保留所有：**
- 跳过此步骤，继续流程

**如果未发现重复文件：**
- 显示 "✨ 未发现重复文件！"
- 直接继续下一步

### 12. 输出报告
```bash
# 检查源目录是否清空
ls -1 "$source" | wc -l

# 显示各分类文件数
echo ""
echo "📊 分类统计："
for dir in "$target"/*/; do
  dir_name=$(basename "$dir")
  echo "  $dir_name"
done
```

## 技术说明

- 文件名语义分析不依赖扩展名
- 支持中文和英文文件名
- 动态生成分类，无固定模板
- 优先匹配目标目录现有分类
- 自动创建不存在的目录结构
- 跳过隐藏文件（`.` 开头）

