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. 扫描目标目录
ls -la "$target"
- 检查是否已有分类目录
- 如有,记录现有分类列表供后续匹配
5. 扫描源文件
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 生成的分类,向用户展示整理计划。
示例格式(使用实际变量):
📁 源目录: $source (13 个文件)
📂 目标目录: $target (新建分类)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📚 01-01_学习资料 (3 files)
├── 学习笔记Python.pdf
├── 课程视频.mp4
└── 教程.md
💻 01-02_代码项目 (2 files)
├── React组件.tsx
└── script.py
📦 01-03_压缩备份 (2 files)
├── backup.zip
└── archive.tar.gz
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
完成后目录将自动更新为:01-01[03]学习资料 等格式
注意: 显示时使用实际的 $source 和 $target 变量值,不要硬编码路径。
8. 用户确认(必须)
使用 AskUserQuestion 询问是否执行:
- 必须等待用户确认后才能执行移动操作
9. 创建目录结构
根据步骤 6 生成的分类,动态创建目录。
格式: $target/编号_类别名称
示例(根据实际分类动态创建):
# 假设 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. 更新分类目录名称
在所有文件移动完成后,统计每个分类的文件数量,并更新目录名称格式。
格式: 编号[数量]类别名称
- 编号:Johnny Decimal 格式(如
01-01,01-10) - [数量]:两位数补零(如
[07],[28]) - 类别名称:语义化的分类名称
# 为每个分类目录重命名,添加文件数量
# 初始目录名称格式为 "编号_类别名称",重命名为 "编号[数量]类别名称"
echo "🔄 正在更新分类目录名称..."
for dir in "$target"/*/; do
dir_path="$dir"
dir_name=$(basename "$dir_path")
# 跳过非目录文件
[[ ! -d "$dir_path" ]] && continue
# 提取编号和类别名称(初始格式 "编号_类别名称")
if [[ "$dir_name" =~ ^([0-9]{2}-[0-9]{2})_(.+)$ ]]; then
number="${BASH_REMATCH[1]}"
category="${BASH_REMATCH[2]}"
# 统计文件数量(只统计文件,不包括子目录)
count=$(find "$dir_path" -maxdepth 1 -type f | wc -l | tr -d ' ')
# 格式化数量为两位数补零
printf -v count_padded "%02d" "$count"
# 新目录名称:编号[数量]类别名称
new_name="${number}[${count_padded}]${category}"
# 重命名目录
mv "$dir_path" "$target/$new_name"
echo " ✓ $dir_name → $new_name"
else
echo " ⚠️ 跳过: $dir_name (格式不符合 编号_类别名称)"
fi
done
echo "✅ 目录名称更新完成"
11.5. 重复文件检查与处理
在移动文件完成后,检查目标目录是否存在重复文件。
# 调用 Python 脚本检查重复文件
python3 scripts/check_duplicates.py "$target"
脚本输出示例:
🔍 重复文件检查报告
============================================================
📂 目标目录: /Users/user/Documents/Archives
📄 总文件数: 45
✅ 唯一文件: 42
🔄 重复组数: 1
⚠️ 发现以下重复文件:
MD5: a1b2c3d4e5f6...
大小: 1,234,567 字节
✅ 保留: 01-01[03]学习资料/document.pdf
时间: 2025-02-10 14:30:00
🗑️ 重复: 01-02[02]代码项目/document.pdf
时间: 2025-02-15 09:20:00
处理重复文件(如果发现重复):
使用 AskUserQuestion 询问用户处理方式:
选项:
- 自动删除重复文件(保留每组最早创建的文件)
- 保留所有文件(不做任何修改)
- 查看详细报告(显示完整 JSON 报告)
如果选择自动删除:
python3 scripts/check_duplicates.py "$target" --delete
删除策略:
- 每个 MD5 组保留修改时间最早的文件
- 删除其余重复文件
- 显示删除文件数和释放空间
如果选择保留所有:
- 跳过此步骤,继续流程
如果未发现重复文件:
- 显示 "✨ 未发现重复文件!"
- 直接继续下一步
12. 输出报告
# 检查源目录是否清空
ls -1 "$source" | wc -l
# 显示各分类文件数(目录名称已包含数量)
echo ""
echo "📊 分类统计:"
for dir in "$target"/*/; do
dir_name=$(basename "$dir")
echo " $dir_name"
done
技术说明
- 文件名语义分析不依赖扩展名
- 支持中文和英文文件名
- 动态生成分类,无固定模板
- 优先匹配目标目录现有分类
- 自动创建不存在的目录结构
- 跳过隐藏文件(
.开头)