在日常使用macOS的过程中,下载文件夹和桌面经常堆积大量散乱文件,手动分类既耗时又容易出错。本文分享一个用Python 3编写的多功能自动化脚本,能够通过一次命令快速完成文件整理,提升工作效率。

脚本的核心功能与设计亮点

这个脚本并非简单的文件移动工具,而是构建了一套完整的“扫描-分类-防冲突-清理”闭环逻辑。以下是其主要功能特点:

  • 全深度递归扫描:不仅整理目标根目录,还会穿透所有子文件夹,将散落在深层路径的文件全部提取出来。
  • 中文语义分类:根据文件扩展名,将文件自动归类至“图片”、“文档”、“安装包”、“压缩包”、“视频”、“音频”、“脚本与代码”、“设计工程”及“其他”等9个中文文件夹。
  • 冲突防止机制:若目标分类文件夹中已存在同名文件,脚本会自动重命名新移动的文件(例如:测试文件.pdf 变为 测试文件_1.pdf),确保数据不会被覆盖。
  • 自动清理冗余目录:在文件移动完成后,脚本会采用“自底向上”的逻辑检测并删除所有因文件移出而产生的空文件夹。
  • 系统环境适配:针对macOS优化,自动忽略 .DS_Store 等系统隐藏文件,且在判定文件夹是否为空时会先行排除此类干扰文件。
  • 动态路径支持:支持在执行命令时实时输入目标路径,兼容 ~(家目录)及 .(当前目录)等快捷路径符。

设计思路:脚本的模块化设计使其易于扩展,例如要新增一种文件类型分类,只需修改 FILE_CATEGORIES 字典即可,无需改动核心逻辑。

脚本文件与代码结构

脚本已开源至GitHub,地址为:Mac_shells/organize.py at main · zhyong26/Mac_shells。以下是完整的脚本内容:

#!/usr/bin/env python3
# coding=utf-8
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
# 检查是否为空目录(排除 macOS 的隐藏文件 .DS_Store)
items = [i for i in os.listdir(current_path) if i != '.DS_Store']
if not items:
try:
# 删除可能存在的 .DS_Store 随后删除文件夹
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--- 整理及清理任务执行完毕 ---")

代码中使用了Python标准库中的osshutilpathlib模块,无需额外安装第三方依赖。与JavaScript或TypeScript项目不同,Python脚本在macOS上天然可执行,无需配置构建工具链。

⚠️ 技术延伸:如果你熟悉Java或C++,可能会觉得Python的文件操作代码更简洁、更易读。这正是Python在自动化脚本领域广受欢迎的原因之一。

使用说明与执行步骤

使用该脚本只需几个简单步骤:

  1. 环境准备:确保macOS已安装Python 3.x。在终端输入 python3 --version 确认版本。
  2. 保存脚本:将代码保存为文本文件,命名为 organizer.py
  3. 打开终端:启动macOS终端(Terminal)。
  4. 运行命令:输入以下指令并回车(将 [目标路径] 替换为实际文件夹路径):

python3 organizer.py [目标路径]

以下是几个常见的使用场景示例:

  • 整理下载文件夹
    python3 organizer.py ~/Downloads
  • 整理当前目录
    python3 organizer.py .
  • 整理特定工作目录
    python3 organizer.py /Users/YourName/Desktop/Project_Files

执行后效果立竿见影,文件夹变得清爽整洁。以下是执行前后的对比图:

在这里插入图片描述

实践建议:建议首次使用时先在一个测试文件夹上运行,确认脚本行为符合预期后再用于重要目录。

注意事项与潜在风险

尽管脚本设计得相当健壮,但仍需注意以下几点:

  • 路径权限:若目标目录下包含受系统保护的文件或文件夹,脚本可能会因权限不足(Permission Denied)报错。此时可尝试在命令前添加 sudo(慎用)。
  • 非空判断标准:脚本在检测“空文件夹”时仅排除了 .DS_Store。如果文件夹内包含 .gitignore 或其他脚本未定义的隐藏配置文件,该文件夹将不会被删除。
  • 操作不可逆:脚本执行的是物理移动和目录删除操作(不进入废纸篓)。建议在对重要数据执行前先进行备份,或在小范围内进行测试。
  • 文件类型识别限制:分类完全基于文件后缀名。若文件无后缀或后缀不符合预设列表,将被统一归类至“其他”。

安全提示:如果你希望保留原始文件结构,可以考虑在脚本中添加“复制而非移动”的选项,或者先使用--dry-run参数预览将要执行的操作。

[AFFILIATE_SLOT_1]

总结与延伸

这个Python脚本通过自动化文件分类、冲突处理和空目录清理,为macOS用户提供了一套高效、安全的工作流解决方案。其设计体现了对系统特性、用户心理和工程实践的深度考量,已接近轻量级开源工具的标准。

你可以根据自身需求扩展分类规则,例如添加对设计工程文件(如Photoshop、Sketch)或开发项目文件(如TypeScript、Java、C++源码)的识别。随着使用经验的积累,脚本将成为你日常工作中不可或缺的效率利器。

核心关键词:#Python自动化 #文件智能归类 #macOS效率工具 #目录结构清理 #中文语义分类

个人博客;材料与逻辑,文章同步发表,欢迎关注~

[AFFILIATE_SLOT_2]