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
相关产品推荐
相关产品推荐

