find+rename命令重命名目录失效,需Python替换目录名date=为day=
Python实现批量将目录名中date=替换为day=
问题背景
执行find命令扫描目标目录,得到所有匹配date=*的目录列表:
$ find tmp/ -name "date=*" -type d tmp/year=2022/month=05/date=27 tmp/year=2022/month=05/date=21 tmp/year=2022/month=05/date=29 tmp/year=2022/month=05/date=24 tmp/year=2022/month=05/date=31 tmp/year=2022/month=06/date=01 tmp/year=2022/month=06/date=02
需求为将上述所有目录名中的date=字段替换为day=。最初尝试通过find+rename的组合命令完成操作:
find tmp/ -name "date=*" -type d -exec rename s/date=/day=/g "{}" +;
命令执行后未完成预期重命名,需要通过Python脚本实现该需求。
原rename命令失效原因
- 发行版工具差异:Linux平台存在两个版本的
rename工具,Debian/Ubuntu系默认搭载Perl版rename,支持s/匹配规则/替换值/的正则替换语法;CentOS/RHEL等多数RPM系发行版默认搭载util-linux版rename,仅支持rename 原字符串 新字符串 目标路径的简单字符串替换语法,不支持正则写法,是本次命令失效的核心原因 - 遍历顺序风险:批量重命名目录时如果从浅层级目录开始处理,上层目录重命名后会导致下层路径失效,后续匹配和重命名操作会报错。本次场景中
date=目录为最末级叶子目录,该问题未触发,但属于目录批量操作的通用注意点。
Python实现代码
脚本通过os.walk的topdown=False参数实现从最深层目录往上层遍历,从根源避免路径修改导致的匹配失效问题,代码如下:
import os # 配置待扫描的根目录 ROOT_PATH = "tmp/" for dir_path, dir_names, _ in os.walk(ROOT_PATH, topdown=False): for dir_name in dir_names: if dir_name.startswith("date="): old_full_path = os.path.join(dir_path, dir_name) new_dir_name = dir_name.replace("date=", "day=", 1) new_full_path = os.path.join(dir_path, new_dir_name) os.rename(old_full_path, new_full_path) print(f"重命名完成: {old_full_path} -> {new_full_path}")
操作步骤
- 将脚本保存为
rename_date_dir.py,放在tmp/目录的同级路径下;如果tmp/不在当前工作目录,修改ROOT_PATH为tmp/的绝对路径即可 - 首次运行建议先注释
os.rename那一行,只打印新旧路径的对应关系,确认匹配逻辑无误后再放开注释实际执行,避免误改文件 - 执行脚本命令:
python3 rename_date_dir.py - 执行完成后重新运行
find tmp/ -name "date=*" -type d,无返回结果即代表重命名全部完成,可通过find tmp/ -name "day=*" -type d校验重命名后的目录列表
提示:重命名操作前建议对目标目录做备份,防止操作失误导致数据丢失。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

