2. 文件批量重命名与整理
任务说明
在数字IC项目中,RTL文件常需按新规范批量重命名(如添加模块前缀或版本后缀),并移动到按功能分类的目录结构中。手工操作效率低且易错,本案例用Python脚本实现自动化处理。
实现方案
脚本读取源目录下所有.v/.sv文件,根据文件名中的模块名添加前缀rtl_,同时将文件按功能关键字(ctrl/datapath/mem)分类移动到目标目录的对应子文件夹中。若目标文件已存在则自动重命名避免覆盖。
完整代码
import os
import shutil
import re
def classify_module(filename):
"""根据文件名中的关键字返回目标子目录名"""
name_lower = filename.lower()
if 'ctrl' in name_lower:
return 'controller'
elif 'datapath' in name_lower or 'alu' in name_lower:
return 'datapath'
elif 'mem' in name_lower or 'ram' in name_lower:
return 'memory'
else:
return 'other'
def batch_rename_and_organize(src_dir, dst_root, prefix='rtl_'):
"""
批量重命名并整理RTL文件
src_dir: 源目录(含.v/.sv文件)
dst_root: 目标根目录(自动创建子目录)
"""
if not os.path.isdir(src_dir):
raise ValueError(f"源目录不存在: {src_dir}")
os.makedirs(dst_root, exist_ok=True)
# 收集所有RTL文件
rtl_files = [f for f in os.listdir(src_dir)
if f.endswith(('.v', '.sv')) and os.path.isfile(os.path.join(src_dir, f))]
if not rtl_files:
print("未找到任何 .v/.sv 文件")
return
renamed_count = 0
for fname in sorted(rtl_files):
# 1. 生成新文件名:添加前缀
new_name = prefix + fname
# 2. 确定目标子目录
sub_dir = classify_module(fname)
dest_dir = os.path.join(dst_root, sub_dir)
os.makedirs(dest_dir, exist_ok=True)
# 3. 处理目标路径冲突(自动加序号)
dest_path = os.path.join(dest_dir, new_name)
base, ext = os.path.splitext(new_name)
counter = 1
while os.path.exists(dest_path):
dest_path = os.path.join(dest_dir, f"{base}_{counter}{ext}")
counter += 1
# 4. 执行移动(重命名)
src_path = os.path.join(src_dir, fname)
shutil.move(src_path, dest_path)
renamed_count += 1
print(f"[OK] {fname} → {os.path.relpath(dest_path, dst_root)}")
print(f"\n完成:共处理 {renamed_count} 个文件")
if __name__ == "__main__":
# 使用示例:将 ./rtl_src 下文件整理到 ./rtl_organized
batch_rename_and_organize(
src_dir="./rtl_src",
dst_root="./rtl_organized",
prefix="rtl_"
)
运行方式
- 创建测试目录结构:
mkdir -p rtl_src,放入若干.v/.sv文件,例如:top_ctrl.v、alu_datapath.sv、ram_mem.v、uart.v - 执行脚本:
python3 rename_rtl.py
验证方法
运行后检查:
- 源目录
rtl_src应为空(所有文件已移走); - 目标目录
rtl_organized下生成controller/、datapath/、memory/、other/四个子目录; - 每个文件名均带
rtl_前缀,且位于正确分类目录中(如top_ctrl.v→rtl_organized/controller/rtl_top_ctrl.v); - 若目标目录已有同名文件,新文件自动以
_1、_2后缀区分,无覆盖丢失。
满足以上条件即判定脚本功能正常。
关键说明
分类规则通过classify_module()中的关键字匹配实现,实际项目中可按需修改关键字与子目录映射。脚本使用shutil.move完成跨目录重命名,若需保留源文件副本,可将move改为copy2。