V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
huntagain2008
V2EX  ›  分享创造

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

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

    视频文件共有 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   ·   实用小工具   ·   3020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.