You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python批量移动cd_前缀目录至新路径并保留原目录结构

实现方案

直接用os.walk配合shutil.move即可实现,核心是利用os.walk自顶向下遍历时可原地修改子目录列表的特性,避免重复遍历已被标记为待移动的cd_目录,同时通过相对路径计算保证目录结构完全对齐,不需要硬编码任何ab-目录的路径。

完整代码

import os
import shutil

SRC = '/home/user/source'
DST = '/home/user/destination'

# 目标根目录不存在则提前创建
os.makedirs(DST, exist_ok=True)

for root, sub_dirs, files in os.walk(SRC, topdown=True):
    # 筛选当前层级下所有cd_开头的目录
    cd_dir_list = [d for d in sub_dirs if d.startswith('cd_')]
    # 从待遍历列表中移除cd_目录,避免walk递归进入其内部(整个目录会被整体移动,无需额外遍历)
    sub_dirs[:] = [d for d in sub_dirs if not d.startswith('cd_')]
    
    for cd_dir in cd_dir_list:
        src_full_path = os.path.join(root, cd_dir)
        # 计算cd目录相对于源根目录的相对路径,用于拼接目标路径保留结构
        rel_path = os.path.relpath(src_full_path, SRC)
        dst_full_path = os.path.join(DST, rel_path)
        
        # 提前创建目标路径的父级目录,避免move报错
        os.makedirs(os.path.dirname(dst_full_path), exist_ok=True)
        # 执行移动(自动包含目录下所有子文件、子目录)
        shutil.move(src_full_path, dst_full_path)

关键逻辑说明

  • 遍历显式开启topdown=True:只有自顶向下遍历时,原地修改sub_dirs列表才会生效,被移除的cd_目录不会被后续递归遍历,既提升大目录场景下的遍历效率,也避免了嵌套cd_目录被重复处理的问题。
  • 用os.path.relpath自动提取相对路径,不管ab-目录下嵌套多少层非cd_的子文件夹,都能自动对齐到目标目录的对应位置,完全适配不固定的内部结构。
  • shutil.move原生支持目录整体移动,跨磁盘分区时会自动走复制+删除逻辑,不需要额外处理文件复制、源文件删除的细节。

安全建议

第一次运行前建议先做干跑验证,把shutil.move那行替换成打印语句,确认所有待移动的源路径、目标路径符合预期后再执行实际移动,避免误操作:

# 干跑验证时替换move语句使用
print(f"[Dry Run] Move: {src_full_path} -> {dst_full_path}")

执行前请确认当前用户对源目录有读/删除权限,对目标目录有写权限。

内容的提问来源于stack exchange,提问作者Bot75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:36:26