通过 Bash Shell 截取字符串进行字幕文件的批量重命名方便加载字幕 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
huntagain2008
V2EX    分享创造

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

  •  
  •   huntagain2008 2022-06-03 09:47:27 +08:00 3121 次点击
    这是一个创建于 1280 天前的主题,其中的信息可能已经有所发展或是发生改变。
    下载整套动漫却没有字幕,中文字幕提示我要善用搜索,终于字幕有了,字幕文件名与视频文件名并不一样,而自动加载字幕要求视频与字幕名字要一样,于是就有了写脚本的动机。

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

    另外,很多播放器都有字幕文件夹自动加载字幕的功能,甚至不用改名,全扔进去,看的时候选一下就行
    iamzuoxinyu
        10
    iamzuoxinyu  
       2022-06-03 14:38:33 +08:00
    @huntagain2008 这种复杂的名字怎么着也得用正则吧。powertoys 也会记录历史,我自己是维护了一个巨长的正则去掉各种字幕组名字和编码格式这些 tag 。
    CrazyRundong
        11
    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
        12
    huntagain2008  
    OP
       2022-06-03 16:22:54 +08:00 via iPhone
    #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
        13
    JackieMe  
       2022-06-03 23:59:30 +08:00 via Android
    看来这个需求的人也不少啊,之前写 Bash 写烦了发现要处理的情况一多就不知道怎么写,后来直接用了 Python 。
    Zinzin
        14
    Zinzin  
       2022-06-04 02:57:58 +08:00 via Android
    我一般用 advanced rename
    AX5N
        15
    AX5N  
       2022-06-04 06:59:33 +08:00
    我以前写过个类似的,还收集过一大堆案例,写得挺复杂的。
    huntagain2008
        16
    huntagain2008  
    OP
       2022-06-04 08:14:00 +08:00   1
    #8 感谢。看到第四集才发现视频文件名有的是[x265_flac_aac].mkv 有的是[x265_flac].mkv ,格式根本不统一,只能用你这类视频文件和字幕文件全部导入,自动匹配,一键改名。还带字幕备份,操作日志
    @qwqaq
    yfugibr
        17
    yfugibr  
       2022-06-04 12:55:10 +08:00
    huntagain2008
        18
    huntagain2008  
    OP
       2022-06-24 08:35:18 +08:00
    rename 对小白来说太难了。FFRenamePro.exe 菲菲更名宝贝 适合我这种小白用户。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3195 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 11:46 PVG 19:46 LAX 03:46 JFK 06:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86