如何使用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
相关产品推荐
相关产品推荐

