批量复制模板化目录结构并顺序重命名文件夹与文件的实现方案求助
批量复制模板化目录结构并顺序重命名文件夹与文件的实现方案求助
嘿,这个需求我之前帮人处理过类似的,用脚本自动化就能完美解决!从你的描述来看,你已经有了一套带token命名规则的模板目录,现在需要批量复制这套结构,同时按顺序更新文件夹和文件名里的编号,还得支持指定复制数量对吧?
先把你的需求示例理清楚:
现有模板结构
RootFolder └── shot_010 └── folder └── shot_010_comp_v01.comp
期望生成的结果(我猜你是想在同一个RootFolder下生成多个shot子目录,或者复制整个RootFolder并同步更新内部编号,两种情况我都给你方案)
情况1:同一RootFolder下生成多个shot目录
RootFolder ├── shot_010 │ └── folder │ └── shot_010_comp_v01.comp ├── shot_020 │ └── folder │ └── shot_020_comp_v01.comp └── shot_030 └── folder └── shot_030_comp_v01.comp
情况2:生成多个独立的RootFolder目录
RootFolder_010 └── shot_010 └── folder └── shot_010_comp_v01.comp RootFolder_020 └── shot_020 └── folder └── shot_020_comp_v01.comp RootFolder_030 └── shot_030 └── folder └── shot_030_comp_v01.comp
方案1:同一RootFolder下批量生成shot子目录(最常用场景)
用Python写个小脚本,递归复制模板的shot_010目录,同时替换所有文件名和文件夹名里的编号:
import os import shutil def duplicate_shot(template_shot_path, root_dir, start_num, step, total_copies): # 循环生成指定数量的shot目录 for i in range(total_copies): # 计算当前要生成的编号 current_num = start_num + step * (i + 1) # 模板里的旧编号字符串(比如"010") old_num_str = f"{start_num:03d}" # 新编号字符串(比如"020"、"030") new_num_str = f"{current_num:03d}" # 新的shot目录路径 new_shot_dir = os.path.join(root_dir, f"shot_{new_num_str}") # 递归复制模板目录 shutil.copytree(template_shot_path, new_shot_dir) # 遍历新生成的目录,重命名所有包含旧编号的文件和文件夹 for root, dirs, files in os.walk(new_shot_dir): # 重命名文件夹 for dir_name in dirs[:]: # 用[:]避免遍历过程中修改列表 if old_num_str in dir_name: new_dir_name = dir_name.replace(old_num_str, new_num_str) old_dir_path = os.path.join(root, dir_name) new_dir_path = os.path.join(root, new_dir_name) os.rename(old_dir_path, new_dir_path) # 更新dirs列表,避免漏处理子目录 dirs[dirs.index(dir_name)] = new_dir_name # 重命名文件 for file_name in files: if old_num_str in file_name: new_file_name = file_name.replace(old_num_str, new_num_str) old_file_path = os.path.join(root, file_name) new_file_path = os.path.join(root, new_file_name) os.rename(old_file_path, new_file_path) # ---------- 替换成你的实际参数 ---------- TEMPLATE_SHOT = "./RootFolder/shot_010" # 你的模板shot目录路径 TARGET_ROOT = "./RootFolder" # 目标根目录(生成的shot_XXX都在这里) START_NUMBER = 10 # 模板的起始编号(对应shot_010的10) STEP = 10 # 编号步长(每次加10) TOTAL_COPIES = 2 # 需要复制的数量(模板本身算1个,这里复制2次得到020、030) # 执行脚本 duplicate_shot(TEMPLATE_SHOT, TARGET_ROOT, START_NUMBER, STEP, TOTAL_COPIES)
方案2:生成多个独立的RootFolder目录
如果是要复制整个RootFolder并同步更新内部的所有编号,只需要稍微修改上面的脚本:
import os import shutil def duplicate_root_folder(template_root, parent_dir, start_num, step, total_copies): for i in range(total_copies): current_num = start_num + step * (i + 1) old_num_str = f"{start_num:03d}" new_num_str = f"{current_num:03d}" # 新的RootFolder路径 new_root = os.path.join(parent_dir, f"RootFolder_{new_num_str}") shutil.copytree(template_root, new_root) # 遍历新RootFolder,替换所有编号 for root, dirs, files in os.walk(new_root): for dir_name in dirs[:]: if old_num_str in dir_name: new_dir_name = dir_name.replace(old_num_str, new_num_str) os.rename(os.path.join(root, dir_name), os.path.join(root, new_dir_name)) dirs[dirs.index(dir_name)] = new_dir_name for file_name in files: if old_num_str in file_name: new_file_name = file_name.replace(old_num_str, new_num_str) os.rename(os.path.join(root, file_name), os.path.join(root, new_file_name)) # ---------- 修改参数 ---------- TEMPLATE_ROOT = "./RootFolder" # 你的模板根目录 PARENT_DIR = "./" # 存放新RootFolder的上级目录 START_NUMBER = 10 STEP = 10 TOTAL_COPIES = 2 duplicate_root_folder(TEMPLATE_ROOT, PARENT_DIR, START_NUMBER, STEP, TOTAL_COPIES)
使用小贴士
- 运行脚本前,一定要先在测试目录里试一遍,避免误操作覆盖现有文件
- 如果你的命名token不是
shot_XXX,比如是seq_001或者asset_05,只需要把脚本里的编号字符串替换成你的规则就行 - 脚本会自动处理空文件夹,不用担心空目录不会被复制
如果你不想用Python,也可以用shell脚本配合rsync和rename命令,但Python脚本的可读性和跨平台性更好,Windows、Mac、Linux都能跑。
备注:内容来源于stack exchange,提问作者Ryan Bloomer
相关产品推荐
相关产品推荐

