file-organizer

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

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "file-organizer" with this command: npx skills add akira82-ai/file-organizer/akira82-ai-file-organizer-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. 扫描目标目录

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-0101-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

技术说明

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

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

file-organizer

No summary provided by upstream source.

Repository SourceNeeds Review
General

file-organizer

No summary provided by upstream source.

Repository SourceNeeds Review
General

file organizer

No summary provided by upstream source.

Repository SourceNeeds Review
General

file-organizer

No summary provided by upstream source.

Repository SourceNeeds Review