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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:45:39