惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
MyScale Blog
MyScale Blog
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
Recent Announcements
Recent Announcements
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
D
Docker
H
Hackread – Cybersecurity News, Data Breaches, AI and More

材料与逻辑

如何理解动力粘度η 铝合金牌号系列对比及选型指南 TPE选型攻略 一次搞懂PPAP:从提交到批准的完整指南 铝合金阳极氧化工艺详解 APQP 第五阶段:量产、反馈、评定与纠正 APQP 第四阶段:产品与过程验证 APQP 第三阶段:过程设计开发 控制计划(Control Plan)在制造业中的深度解析 控制计划(CP):制造业质量管理的核心支柱 OpenClaw 使用指南 PFMEA系统学习与制造业质量工具集成 第一性原理系统学习报告:从认知底层到创新实践 桌面端 EPUB 工具:Jane Reader及不同阅读器功能对比 APQP第二阶段(产品设计和开发)学习与实施指南 APQP第一阶段:顾客声音(VOC)向项目指标转化的标准化指南 制造业研发技术中的WBS(工作分解结构)应用 一个玩具车项目,讲清新版 APQP 怎么干 质量是设计出来的:APQP 核心框架与全流程详解 思维导图系统学习与职场应用指南 ISO 4892 塑料实验室光源暴露试验标准系统梳理与应用分析 高分子材料挤出成型工艺系统研发技术报告 制造业研发人员如何制定高效的项目开发计划:从材料开发到工艺落地的系统性指南 材料耐候性评价指南:色差值 ΔE 与抗老化等级的标准转换及年限推算 自动化工具:将 Markdown 文档转换为静态 PNG 思维导图脚本 溯因推理:原理、应用与智能演进研究 高分子加工工艺对比与选型参考 归纳推理:从经验观察到知识泛化的系统化研究 铝合金及其关键部件表面处理技术 通过 rclone 自动备份 Lsky Pro(兰空图床)数据至 OneDrive
多功能、自动化整理文件夹Python脚本
ZhangYong · 2026-02-14 · via 材料与逻辑

由于 Mac 下载文件夹经常性文件非常杂乱,自己动手整理又感觉很麻烦,因此制作了一个多功能脚本,可在想整理时,瞬间完成整理。现将脚本分享出来,供有需要的小伙伴使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110


import os
import sys
import shutil
from pathlib import Path


FILE_CATEGORIES = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".svg", ".heic", ".webp", ".raw", ".tiff"],
"文档": [".pdf", ".doc", ".docx", ".txt", ".xlsx", ".csv", ".pptx", ".pages", ".numbers", ".key", ".md"],
"安装包": [".dmg", ".pkg", ".iso", ".app"],
"压缩包": [".zip", ".tar", ".gz", ".rar", ".7z"],
"视频": [".mp4", ".mov", ".webm",".avi", ".mkv", ".wmv", ".flv"],
"音频": [".mp3", ".wav", ".aac", ".flac", ".m4a"],
"电子书": [".epub", ".mobi", ".azw3"],
"脚本与代码": [".py", ".sh", ".js", ".html", ".css", ".cpp", ".json", ".yaml", ".go", ".rs"],
"设计工程": [".psd", ".ai", ".sketch", ".fig", ".dwg"]
}

def get_unique_path(path):
"""处理同名文件冲突:若文件已存在,则添加数字后缀"""
counter = 1
original_path = path
while path.exists():
path = original_path.with_name(f"{original_path.stem}_{counter}{original_path.suffix}")
counter += 1
return path

def clean_empty_folders(target_dir, category_names):
"""递归删除空文件夹(自底向上遍历)"""
print("\n--- 正在清理空文件夹 ---")
for root, dirs, files in os.walk(target_dir, topdown=False):
current_path = Path(root)


if current_path == target_dir or current_path.name in category_names:
continue


items = [i for i in os.listdir(current_path) if i != '.DS_Store']

if not items:
try:

ds_store = current_path / '.DS_Store'
if ds_store.exists():
ds_store.unlink()
current_path.rmdir()
print(f"[Deleted] 空文件夹: {current_path.relative_to(target_dir)}")
except Exception as e:
print(f"[Error] 无法删除文件夹 {current_path}: {e}")

def organize_folder(target_path_str):
target_dir = Path(target_path_str).expanduser().resolve()

if not target_dir.exists() or not target_dir.is_dir():
print(f"错误: 路径 '{target_path_str}' 不存在或不是有效的目录。")
sys.exit(1)


category_names = set(FILE_CATEGORIES.keys())
category_names.add("其他")

print(f"开始整理目录: {target_dir}")


for root, dirs, files in os.walk(target_dir):
current_path = Path(root)


try:
relative_parts = current_path.relative_to(target_dir).parts
if relative_parts and relative_parts[0] in category_names:
continue
except ValueError:
pass

for file_name in files:
if file_name.startswith('.'):
continue

file_path = current_path / file_name
file_ext = file_path.suffix.lower()

target_category = "其他"
for category, exts in FILE_CATEGORIES.items():
if file_ext in exts:
target_category = category
break

dest_folder = target_dir / target_category
dest_folder.mkdir(exist_ok=True)

dest_path = get_unique_path(dest_folder / file_name)
try:
shutil.move(str(file_path), str(dest_path))
except Exception as e:
print(f"[Error] 移动失败 {file_name}: {e}")


clean_empty_folders(target_dir, category_names)

if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python3 脚本名.py <目标文件夹路径>")
sys.exit(1)

organize_folder(sys.argv[1])
print("\n--- 整理及清理任务执行完毕 ---")

该内容介绍了一个面向 macOS 用户设计的高度实用化、生产就绪型文件整理自动化工具——一个用 Python 3 编写的命令行脚本 organize.py。其核心价值在于将重复性高、易出错的手动文件归档工作,转化为一次敲击即可完成的智能、安全、可复现的操作流程

脚本并非简单地按扩展名移动文件,而是构建了一套完整的“整理-防冲突-清理”闭环逻辑:
全路径深度扫描确保不遗漏任何嵌套层级中的散落文件;
中文语义化分类体系兼顾用户直觉与实用性(如区分“安装包”“.dmg/.pkg”与“压缩包”“.zip/.7z”,而非笼统归为“归档”);
健壮的冲突解决机制(自动重命名而非覆盖/报错),保障数据完整性;
自底向上空目录清理结合 .DS_Store 过滤,精准还原目录结构清爽度;
动态路径解析能力(支持 ~.、绝对路径)显著提升交互友好性;
模块化设计与清晰注释使代码具备良好可读性、可维护性与可扩展性(如新增分类只需修改 FILE_CATEGORIES 字典)。

尤为值得注意的是,作者在技术实现中体现出对系统特性(macOS 隐藏文件)、用户心理(中文界面、即时反馈)、工程实践(错误捕获、权限提示、不可逆操作警示) 的深度考量,远超一般“玩具脚本”,已接近轻量级开源工具的标准。