乐于分享
好东西不私藏

我用 AI 写了个脚本,下载文件夹从此自己变整齐

我用 AI 写了个脚本,下载文件夹从此自己变整齐

篇幅大约 7 分钟

下载文件夹是每个人的电脑「垃圾场」。安装包、文档、图片、压缩包……全都往里面堆,时间一长,找个文件翻半天,同名文件还带一串 (1)(2)(3)

这次不手动整理了。让 AI 帮我写个脚本,一键分类归位,还能定时自动跑。全程只移动不删除,安全可回退

先说痛点:为什么下载文件夹总是乱

装软件的安装包、微信传的文档、随手存的图片、导出的表格、压缩包……全都往「下载」里堆。

时间一长:

  • 找文件翻半天,同名还带一串 (1)(2)(3)
  • 几个 G 的安装包躺了半年没删,白占空间
  • 想手动整理,面对几百个文件又懒得动
手动整理是「体力活」,而体力活正是脚本最擅长的。

思路:让 AI 当「文件管理员」

目标很简单——按文件类型自动分类到子文件夹

类型 扩展名示例 归到文件夹
图片 jpg / png / gif / webp 图片/
文档 pdf / doc / xlsx / pptx 文档/
压缩包 zip / rar / 7z / tar.gz 压缩包/
安装包 exe / msi / dmg / deb 安装包/
影音 mp4 / mp3 / mkv / wav 影音/
其它 不在以上列表的 其它/

四条安全原则(直接写进给 AI 的要求里):

  1. 只移动,不删除——脚本永远不删你的文件
  2. 先预演(dry-run)——第一次跑只打印「打算怎么移」,不真动
  3. 重名不覆盖——遇到同名自动加序号,绝不覆盖
  4. 可回退——记录移动日志,后悔了一键还原

给 AI 的提示词(可直接抄)

把下面这段丢给任何能写代码的 AI(OpenCode / Claude / GPT 都行):

帮我写一个 Python 脚本,整理我的「下载」文件夹。要求:
1. 按文件扩展名,把文件分类移动到子文件夹:图片、文档、压缩包、安装包、影音、其它;
2. 只移动不删除;子文件夹里已有同名文件时,自动加序号,不覆盖;
3. 支持 –dry-run 参数:只打印将要执行的移动,不实际操作;
4. 每次真正移动时,写一份 move_log.json 记录「从哪移到哪」;
5. 再写一个 –undo 参数:读取 move_log.json,把文件原样移回去;
6. 跨平台(Windows / macOS / Linux),只用标准库;
7. 加清晰的中文提示和统计(本次移动了多少个文件)。
提示词里把「安全边界」说死,AI 生成的脚本才靠谱。

AI 生成的脚本(可直接用)

下面是按上面要求生成、实测可用的版本(只依赖 Python 标准库):

import sys, json, shutil
from pathlib import Path

# 分类规则:扩展名 -> 目标子文件夹
CATEGORIES = {
  “图片”:   {“.jpg”, “.jpeg”, “.png”, “.gif”, “.webp”, “.bmp”, “.svg”},
  “文档”:   {“.pdf”, “.doc”, “.docx”, “.xls”, “.xlsx”, “.ppt”, “.pptx”, “.txt”, “.md”},
  “压缩包”: {“.zip”, “.rar”, “.7z”, “.tar”, “.gz”, “.tgz”, “.bz2”, “.xz”},
  “安装包”: {“.exe”, “.msi”, “.dmg”, “.pkg”, “.deb”},
  “影音”:   {“.mp4”, “.mkv”, “.mov”, “.mp3”, “.wav”, “.flac”},
}

DOWNLOADS = Path.home() / “Downloads”      # 下载文件夹
LOG = DOWNLOADS / “move_log.json”          # 移动日志

def category_of(ext):
  for name, exts in CATEGORIES.items():
    if ext.lower() in exts:
      return name
  return “其它”

def unique_path(target):
  # 目标已存在则加序号,绝不覆盖
  if not target.exists():
    return target
  stem, suffix, i = target.stem, target.suffix, 1
  while True:
    cand = target.with_name(f”{stem}({i}){suffix}”)
    if not cand.exists():
      return cand
    i += 1

def tidy(dry_run=False):
  moves = []
  for item in DOWNLOADS.iterdir():
    if item.is_dir() or item.name == “move_log.json”:
      continue                       # 跳过子文件夹和日志本身
    dest_dir = DOWNLOADS / category_of(item.suffix)
    dest = unique_path(dest_dir / item.name)
    moves.append((str(item), str(dest)))
    if dry_run:
      print(f”[预演] {item.name}  ->  {dest_dir.name}/”)
    else:
      dest_dir.mkdir(exist_ok=True)
      shutil.move(str(item), str(dest))
      print(f”已移动 {item.name}  ->  {dest_dir.name}/”)
  if not dry_run and moves:
    # 日志累积:保留未还原的记录,支持多次整理后一键还原
    existing = json.loads(LOG.read_text(encoding=“utf-8”)) if LOG.exists() else []
    LOG.write_text(json.dumps(existing + moves, ensure_ascii=False, indent=2), encoding=“utf-8”)
  print(f”\n完成,共处理 {len(moves)} 个文件” + (“(仅预演,未实际移动)” if dry_run else “”))

def undo():
  if not LOG.exists():
    print(“没有找到移动日志,无法回退。”); return
  moves = json.loads(LOG.read_text(encoding=“utf-8”))
  for src, dest in reversed(moves):
    if not Path(dest).exists():
      continue                       # 文件已不在原地(可能手动处理过),跳过
    target = unique_path(Path(src))  # 原位置已有同名则加序号,绝不覆盖
    shutil.move(dest, str(target))
    if str(target) == src:
      print(f”已还原 {Path(dest).name}”)
    else:
      print(f”已还原 {Path(dest).name}  ->  {target.name}(已加序号避免覆盖)”)
  LOG.unlink()
  print(“已全部还原。”)

if __name__ == “__main__”:
  if “–undo” in sys.argv:
    undo()
  else:
    tidy(dry_run=“–dry-run” in sys.argv)

怎么用(三步)

保存成 tidy_downloads.py,然后:

# 第一步:预演,先看它打算怎么移(强烈建议)
python tidy_downloads.py –dry-run

# 第二步:确认没问题,真正执行
python tidy_downloads.py

# 后悔了?一键还原到整理前
python tidy_downloads.py –undo

第一次一定先跑 --dry-run,确认分类逻辑符合你的习惯,再真动手。

进阶:让它定时自动整理

不想每次手动跑?挂个定时任务,让下载文件夹自己保持整齐:

Windows:用「任务计划程序」新建任务 → 触发器设「每天 / 登录时」,操作填:

python C:\路径\tidy_downloads.py

macOS / Linux:用 crontab,例如每天 20 点整理一次:

0 20 * * * /usr/bin/python3 ~/scripts/tidy_downloads.py

从此下载文件夹「自愈」,再也不用手动收拾。

小结

这件事的价值不在脚本本身,而在思路:把重复的体力活描述清楚,交给 AI 生成工具,自己只做「定规则」和「按确认」

三个要点值得记住:

  • 提示词里把安全边界(只移不删、可回退、不覆盖)说死
  • 破坏性操作先预演再执行
  • 好用的脚本就定时自动化,让它长期替你干活
下次面对任何「重复、机械、烦人」的电脑操作,都可以这么想一遍:
这能不能让 AI 写个脚本自动搞定?

AI脚本
效率工具
Python
自动化

XFactor实验室 · 用不确定,做出确定的东西