编写Bash脚本批量重命名MKV影片:给年份加括号并清理冗余
MKV影片批量重命名解决方案
我的硬盘单个目录中有数百部MKV格式影片,命名格式如下:
Gold.2022.mkv Oppenheimer.2023.Imax.mkv Ted.2012.Unrated.mkv Dr.Strangelove.1964.mkv需要编写Bash脚本自动重命名这些文件:移除年份后的所有内容(保留.mkv扩展名)、删除年份前的点号,最后给年份加上括号,使文件变为:
Gold (2022).mkv Oppenheimer (2023).mkv Ted (2012).mkv Dr.Strangelove (1964).mkv若无法实现完整需求,仅给年份加括号的方法是什么?
一、完整需求的Bash脚本实现
两种方式可选,按需使用:
1. 用Perl版rename命令(一行搞定)
大部分Linux发行版自带Perl版rename,支持正则替换,直接运行:
rename 's/^(.+)\.(\d{4})\..*\.mkv$/$1 ($2).mkv/' *.mkv
逻辑说明:
^(.+)\.(\d{4}):捕获文件名主体(年份前的部分)和4位数字年份\..*\.mkv$:匹配年份到.mkv之间的所有冗余内容并删除$1 ($2).mkv:拼接成「文件名 (年份).mkv」的格式
2. 纯Bash循环(无额外依赖)
如果系统没有Perl版rename,用原生Bash循环也能实现:
for file in *.mkv; do # 先去掉.mkv扩展名 name_no_ext="${file%.mkv}" # 匹配主体和年份 if [[ "$name_no_ext" =~ ^(.+)\.([0-9]{4}) ]]; then prefix="${BASH_REMATCH[1]}" year="${BASH_REMATCH[2]}" new_name="${prefix} (${year}).mkv" # 加-n参数先预览,确认无误后再删掉-n执行重命名 mv -n "$file" "$new_name" fi done
二、仅给年份加括号的方法
如果只需要给年份套括号、保留其他后缀内容,用下面的命令:
1. Perl版rename快捷方式
rename 's/\.(\d{4})/ ($1)/' *.mkv
执行后Oppenheimer.2023.Imax.mkv会变成Oppenheimer (2023).Imax.mkv。
2. 纯Bash循环实现
for file in *.mkv; do if [[ "$file" =~ ^(.+)\.([0-9]{4})(.*\.mkv)$ ]]; then prefix="${BASH_REMATCH[1]}" year="${BASH_REMATCH[2]}" suffix="${BASH_REMATCH[3]}" new_name="${prefix} (${year})${suffix}" mv -n "$file" "$new_name" fi done
内容的提问来源于stack exchange,提问作者Entropy1024
相关产品推荐
相关产品推荐

