通过 Bash Shell 截取字符串进行字幕文件的批量重命名方便加载字幕

2022-06-03 09:47:27 +08:00
 huntagain2008
下载整套动漫却没有字幕,中文字幕提示我要善用搜索,终于字幕有了,字幕文件名与视频文件名并不一样,而自动加载字幕要求视频与字幕名字要一样,于是就有了写脚本的动机。

视频文件共有 24 个:
[VCB-Studio] Zetsuen no Tempest [01][Ma10p_1080p][x265_flac_aac].mkv
[VCB-Studio] Zetsuen no Tempest [02][Ma10p_1080p][x265_flac_aac].mkv
[VCB-Studio] Zetsuen no Tempest [03][Ma10p_1080p][x265_flac_aac].mkv
...
[VCB-Studio] Zetsuen no Tempest [24][Ma10p_1080p][x265_flac_aac].mkv

字幕文件共有 24 个,比如绝园的暴风雨 03.ass

要将 绝园的暴风雨 03.ass 重命名为
[VCB-Studio] Zetsuen no Tempest [03][Ma10p_1080p][x265_flac_aac].mkv

我想到将字幕的集数 03 截取出来,然后再重命名即可

代码如下:

for file in *; do echo ${file:0-6:2}; done

${file:0-6:2} # “绝园的暴风雨 03.ass”从右边数第六个字符开始,截取 2 个字符,所以是 03

最后加上重命名,大功告成

for file in *; do mv $file "[VCB-Studio] Zetsuen no Tempest [${file:0-6:2}][Ma10p_1080p][x265_flac_aac].ass"; done
2308 次点击
所在节点    分享创造
18 条回复
yfugibr
2022-06-03 10:21:27 +08:00
rename 直接用正则就行
rename -v 's/.*(\d+).*/VCB-Studio] Zetsuen no Tempest [${1}][Ma10p_1080p][x265_flac_aac].mkv.ass/' *.ass
iamzuoxinyu
2022-06-03 11:02:53 +08:00
我一直用的 powertoys 里的批量重命名,贼好用。
bipy
2022-06-03 11:57:09 +08:00
huntagain2008
2022-06-03 13:00:31 +08:00
@bipy 看了 c#的源码也是截取字符串
var fileName = MovieFileName.Substring(0, MovieFileName.LastIndexOf(".", StringComparison.Ordinal));
zh4710jj
2022-06-03 13:01:18 +08:00
perl-rename
butanediol2d
2022-06-03 13:04:14 +08:00
rename 正则 +1
huntagain2008
2022-06-03 13:34:05 +08:00
@iamzuoxinyu #2 powertoys 不写正则表达式能改名吗?若需要正则,那用#1 的替换还快些。
qwqaq
2022-06-03 14:02:06 +08:00
😉 可以来试试我写的这个: https://github.com/qwqcode/SubRenamer
imn1
2022-06-03 14:27:14 +08:00
这些有连续序号的,重命名不是难事,例如有些改名工具有导入功能,把视频文件清单导入,保留扩展名重命名就可以了

另外,很多播放器都有字幕文件夹自动加载字幕的功能,甚至不用改名,全扔进去,看的时候选一下就行
iamzuoxinyu
2022-06-03 14:38:33 +08:00
@huntagain2008 这种复杂的名字怎么着也得用正则吧。powertoys 也会记录历史,我自己是维护了一个巨长的正则去掉各种字幕组名字和编码格式这些 tag 。
CrazyRundong
2022-06-03 15:29:34 +08:00
前几天也在 nas 上写了个类似的脚本,稍微处理了下不同季和不同字幕组 /压制组间的字幕匹配:

```bash
#!/bin/bash
set -e

mkv_dir=${1:-"$PWD"}
sub_dir=${2:-"$PWD/权力的游戏.S03"}
season="03"

for ((ep = 1; ep <= 10; ep++)); do
mkv_path=$(find "${mkv_dir}" -regex ".*S${season}E$( printf '%02d' ${ep} ).*\.mkv$" ! -regex '.*\@eaDir.*' ! -iname '._*')
mkv_name=$(basename "${mkv_path}" '.mkv')
mkv_dir=$(dirname "${mkv_path}")
ass_path=$(find "${sub_dir}" -regex ".*S${season}E$( printf '%02d' ${ep} ).*\.ass$" ! -regex '.*\@eaDir.*' ! -iname '._*')
ass_name=$(basename "${ass_path}" '.ass')
ass_dir=$(dirname "${ass_path}")
ass_new_path="${mkv_dir}/${mkv_name}.chs-eng.ass"

ass_path_normalized=$(realpath "$ass_path")
ass_new_path_normalized=$(realpath "$ass_new_path")
printf 'EP%02d: %s\t==>\t%s\n' $ep "$ass_path_normalized" "$ass_new_path_normalized"
cp "$ass_path_normalized" "$ass_new_path_normalized"
done
```
huntagain2008
2022-06-03 16:22:54 +08:00
#1 用的 rename 需要安装。 ${1}只能取到 0-9 ,需要的是 01-24
小白把脚本改了一下,试了下是对的
rename -v 's/.*(\d\d).*/[VCB-Studio] Zetsuen no Tempest [${1}${2}][Ma10p_1080p][x265_flac_aac].ass/' *.ass
@yfugibr
JackieMe
2022-06-03 23:59:30 +08:00
看来这个需求的人也不少啊,之前写 Bash 写烦了发现要处理的情况一多就不知道怎么写,后来直接用了 Python 。
Zinzin
2022-06-04 02:57:58 +08:00
我一般用 advanced rename
AX5N
2022-06-04 06:59:33 +08:00
我以前写过个类似的,还收集过一大堆案例,写得挺复杂的。
huntagain2008
2022-06-04 08:14:00 +08:00
#8 感谢。看到第四集才发现视频文件名有的是[x265_flac_aac].mkv 有的是[x265_flac].mkv ,格式根本不统一,只能用你这类视频文件和字幕文件全部导入,自动匹配,一键改名。还带字幕备份,操作日志
@qwqaq
yfugibr
2022-06-04 12:55:10 +08:00
huntagain2008
2022-06-24 08:35:18 +08:00
rename 对小白来说太难了。FFRenamePro.exe 菲菲更名宝贝 适合我这种小白用户。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/857075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX