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

如何使用find与prename递归重命名带年份括号的目录?

解决目录重命名问题:将[YYYY] 名称改为YYYY - 名称

首先,你遇到的^无法使用的问题,是因为find的-name参数用的是shell glob通配符,不是正则表达式——^在glob里没有“匹配开头”的作用,所以加了之后反而匹配不到结果。如果要精确匹配「以[四位数字]开头」的目录,推荐改用-regex参数(它支持正则,且默认匹配完整文件路径):

find . -type d -regex '.*/\[[0-9]{4}\] .*'

接下来是重命名的核心部分,我们可以用find的-execdir配合bash脚本,批量处理匹配到的目录。-execdir会切换到目标目录的父目录执行命令,这样我们只需要处理目录名本身,不用操心完整路径的问题,更安全。

方法1:用bash内置字符串操作(无需额外工具)

find . -type d -regex '.*/\[[0-9]{4}\] .*' -execdir bash -c '
  # 遍历所有传入的目录
  for dir do
    # 从目录名中提取年份:跳过开头的「[」,取4个字符
    year="${dir:1:4}"
    # 提取年份后的名称:跳过「[YYYY] 」这6个字符([+4位+]+空格)
    rest="${dir:6}"
    # 执行重命名,-v参数会显示操作过程,方便验证
    mv -v "$dir" "${year} - ${rest}"
  done
' bash {} +

方法2:用sed正则替换(更直观的模式匹配)

如果你觉得正则替换更容易理解,可以用sed来处理目录名:

find . -type d -regex '.*/\[[0-9]{4}\] .*' -execdir bash -c '
  for dir do
    # 用sed把「[YYYY] 名称」替换成「YYYY - 名称」
    new_name=$(echo "$dir" | sed -E "s/^\[([0-9]{4})\] (.*)/\1 - \2/")
    mv -v "$dir" "$new_name"
  done
' bash {} +

重要测试步骤

在实际执行重命名前,建议先把mv -v换成echo,预览一下将要执行的操作,确保没有问题:

find . -type d -regex '.*/\[[0-9]{4}\] .*' -execdir bash -c '
  for dir do
    new_name=$(echo "$dir" | sed -E "s/^\[([0-9]{4})\] (.*)/\1 - \2/")
    echo "即将重命名:$dir -> $new_name"
  done
' bash {} +

这样就能安全地完成批量重命名啦!

内容的提问来源于stack exchange,提问作者Jieiku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:51