我用 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 的要求里):
- 只移动,不删除——脚本永远不删你的文件
- 先预演(dry-run)——第一次跑只打印「打算怎么移」,不真动
- 重名不覆盖——遇到同名自动加序号,绝不覆盖
- 可回退——记录移动日志,后悔了一键还原
给 AI 的提示词(可直接抄)
把下面这段丢给任何能写代码的 AI(OpenCode / Claude / GPT 都行):
1. 按文件扩展名,把文件分类移动到子文件夹:图片、文档、压缩包、安装包、影音、其它;
2. 只移动不删除;子文件夹里已有同名文件时,自动加序号,不覆盖;
3. 支持 –dry-run 参数:只打印将要执行的移动,不实际操作;
4. 每次真正移动时,写一份 move_log.json 记录「从哪移到哪」;
5. 再写一个 –undo 参数:读取 move_log.json,把文件原样移回去;
6. 跨平台(Windows / macOS / Linux),只用标准库;
7. 加清晰的中文提示和统计(本次移动了多少个文件)。
AI 生成的脚本(可直接用)
下面是按上面要求生成、实测可用的版本(只依赖 Python 标准库):
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:用「任务计划程序」新建任务 → 触发器设「每天 / 登录时」,操作填:
macOS / Linux:用 crontab,例如每天 20 点整理一次:
从此下载文件夹「自愈」,再也不用手动收拾。
小结
这件事的价值不在脚本本身,而在思路:把重复的体力活描述清楚,交给 AI 生成工具,自己只做「定规则」和「按确认」。
三个要点值得记住:
- 提示词里把安全边界(只移不删、可回退、不覆盖)说死
- 破坏性操作先预演再执行
- 好用的脚本就定时自动化,让它长期替你干活
这能不能让 AI 写个脚本自动搞定?
AI脚本
效率工具
Python
自动化
XFactor实验室 · 用不确定,做出确定的东西
夜雨聆风