保留原目录结构可避免路径混淆,适合多项目并行场景;shutil.copytree需确保目标不存在且用ignore过滤临时文件;pathlib+shutil.move需先建目录树;规则引擎须启用preserve_structure并正确使用$1捕获组。

电脑文件自动整理时保留原目录结构,是为了在归类过程中不破坏原有层级关系,避免把“项目A/源文件/psd”和“项目B/源文件/psd”全塞进同一个“PSD”文件夹导致路径混淆。这种做法特别适合多项目并行、需维持相对路径引用的设计师、前端开发者或科研数据整理者。
用 shutil.copytree 实现结构化复制
第一步:确认源目录无符号链接或占用中文件。shutil.copytree 默认不处理符号链接,遇到会报错;若目标路径已存在,直接失败,必须提前清空或改名。
第二步:编写脚本,调用 copytree 并设置 ignore 参数过滤临时文件:ignore=shutil.ignore_patterns('*.tmp', '__pycache__', '.DS_Store')。这一步跳过缓存与临时文件,防止把编译中间产物也复制过去。
第三步:执行复制命令 → 【dst 目录必须不存在,否则抛出 FileExistsError】。copytree 不支持增量合并,强行覆盖会中断整个流程,必须用 shutil.rmtree(dst) 先删再建。
用 pathlib + shutil.move 逐层迁移并保结构
方法一:按深度优先遍历子目录,对每个匹配文件执行 move 操作,目标路径用 parent.relative_to(src_root).joinpath(file.name) 构造。
方法二:先创建完整目标路径树,再移动文件。用 os.walk 遍历 src_root,每进入一个子目录就用 Path(dst_root).joinpath(rel_path).mkdir(parents=True, exist_ok=True) 创建对应空目录。这一步必须在移动前完成,否则 shutil.move 会因父目录不存在而失败。
注意:Windows 下移动跨卷文件实际是复制+删除,若中途断电可能残留源文件且目标不全。建议优先使用 copy + verify + remove 模式,而非直用 move。
配置规则引擎时启用“路径继承模式”
第一步:在 JSON/YAML 规则文件中开启 "preserve_structure": true 字段。
第二步:定义分类规则时,用 "$1" 引用正则捕获组,例如匹配 "project_(\w+)/.*\.(psd|ai)" → 目标路径设为 "Design/$1/$0",其中 $0 是原始相对路径,$1 是项目名。
第三步:运行工具前执行 dry-run,检查日志里所有 dst 路径是否都包含与 src 对应的嵌套层级。如果出现 "Design/IMG_1234.psd" 这种扁平路径,说明规则未启用路径继承或正则未正确捕获目录名。
这一步操作起来很简单,直接把文件拖进去就行。但若规则里漏写 $1 或写成 $2,就会导致所有匹配文件全部坍缩到一级目录,无法回溯原始归属。











