Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

批量处理字幕的示例可以写的更清晰一点吗? #2

Open
napooo opened this issue Jun 25, 2024 · 3 comments
Open

批量处理字幕的示例可以写的更清晰一点吗? #2

napooo opened this issue Jun 25, 2024 · 3 comments

Comments

@napooo
Copy link

napooo commented Jun 25, 2024

不是程序员,批量处理字幕的示例有好多参数看不懂啊,在help里也没有说明,能把批量处理字幕的示例写的更通俗易懂一些吗,实在是水平有限,拜托了。

@Colin-XKL
Copy link
Owner

抱歉那个批量处理的示例一开始没考虑作为大家上手这个工具的参考脚本, 这个本身是我自己为了方便使用, 为了写成一行, 编写的一个很复杂的指令, 里面使用了很多linux shell 脚本的语法.

@Colin-XKL
Copy link
Owner

可以大概讲一下参数的含义.

find ../Season\ 28/ -type f -name "*.zho.srt" -exec bash -c 'f="{}"; srt-fuzzy-sync run-sync -r "${f%.zho.srt}.eng.srt" -t "$f" -o "${f%.zho.srt}.new.srt" '

这行命令是一个 find 命令,用于在指定目录中查找特定类型的文件,并对每个找到的文件执行一个命令。下面是对每个部分的详细解释:

命令结构

find ../Season\ 28/ -type f -name "*.zho.srt" -exec bash -c '...' \;

各个参数的说明

  1. find: 这是一个用于搜索文件和目录的命令。

  2. ../Season\ 28/:

    • 这是搜索的起始目录。.. 表示上一级目录,Season\ 28 是要搜索的目录名。反斜杠 \ 是用来转义空格的,表示目录名中有空格。
  3. -type f:

    • 这个选项指定了只查找普通文件(即排除目录、设备文件等)。
  4. -name "*.zho.srt":

    • 这个选项指定了查找文件名符合特定模式的文件。在这里,它会查找所有以 .zho.srt 结尾的文件。
  5. -exec:

    • 这是 find 命令的一个选项,用于对找到的每个文件执行后面的命令。
  6. bash -c '...':

    • 这个部分表示要执行的命令。bash -c 允许你在 Bash shell 中执行一个字符串作为命令。
  7. 'f="{}"; ...':

    • f="{}": {}find 命令的特殊符号,表示当前找到的文件的路径。它会被替换为实际的文件名。
    • srt-fuzzy-sync run-sync -r "${f%.zho.srt}.eng.srt" -t "$f" -o "${f%.zho.srt}.new.srt": 这是要执行的具体命令。

具体的命令解释

  • srt-fuzzy-sync run-sync:

    • 这是一个外部命令,用于同步 SRT 字幕文件。
  • -r "${f%.zho.srt}.eng.srt":

    • -r 选项指定了参考文件。${f%.zho.srt}.eng.srt 是对 f 的处理,去掉 .zho.srt 后缀并添加 .eng.srt,用作参考。
  • -t "$f":

    • -t 选项指定了目标文件,"$f" 是当前找到的 .zho.srt 文件。
  • -o "${f%.zho.srt}.new.srt":

    • -o 选项指定了输出文件。${f%.zho.srt}.new.srt 是去掉 .zho.srt 后缀并添加 .new.srt 后缀的文件名称。

总结

整个命令的功能是:在 ../Season 28/ 目录中查找所有以 .zho.srt 结尾的文件,对于每个找到的文件,它将使用 srt-fuzzy-sync 工具进行处理,生成一个新的同步 SRT 文件。

命令结构

rename 's/\.new\.srt/\.zh.srt/' ./*.srt

这个命令使用了 rename 工具,用于批量重命名文件。以下是对该命令的详细解释:

各个部分的说明

  1. rename:

    • 这是一个用于批量重命名文件的命令。
  2. 's/\.new\.srt/\.zh.srt/':

    • 这一部分是一个 Perl 风格的正则表达式,具体含义如下:
      • s/.../.../: 这是替换操作的语法,表示将匹配到的字符串替换为新的字符串。
      • \.new\.srt: 这是需要匹配的模式。\. 表示字面意义上的点字符(.),所以这里匹配的是文件名中的 .new.srt
      • \.zh\.srt: 这是替换后的字符串,表示将匹配到的 .new.srt 替换为 .zh.srt
  3. ./*.srt:

    • 这个部分指定了要处理的文件。./ 表示当前目录,*.srt 表示匹配当前目录下所有以 .srt 结尾的文件。

整体作用

整个命令的作用是:在当前目录中查找所有以 .srt 结尾的文件,检查文件名是否包含 .new.srt,如果包含,则将其重命名为以 .zh.srt 结尾的文件。

示例

  • 假设当前目录下有以下文件:

    • example.new.srt
    • test.new.srt
    • sample.srt
  • 执行命令后,结果将是:

    • example.zh.srt
    • test.zh.srt
    • sample.srt(未改变)

总结

该命令是用于将当前目录中所有 .new.srt 文件后缀替换为 .zh.srt,实现批量重命名。

@Colin-XKL
Copy link
Owner

为了更方便使用和维护, 也可以使用更简洁的shell脚本. 示例如下:

#!/bin/bash

# 设置输入目录
input_dir="/data/media/Loki_S01"

# 遍历目录中的所有 MKV 文件, 如果要处理的是mp4 文件, 把下面所有的mkv 替换为mp4
for mkv_file in "$input_dir"/*.mkv; do
    # 获取文件名(不带扩展名)
    base_name=$(basename "$mkv_file" .mkv)

    # 定义参考字幕和待修正字幕的路径
   
    # 对于一个视频文件 video.mkv
    # 这里假设所有的参考字幕格式为video_ref.srt
    ref_subtitle="$input_dir/${base_name}_ref.srt" 
    # 假设待对齐的文件为 video_nosync.srt
    nosync_subtitle="$input_dir/${base_name}_nosync.srt"
    # 设定新文件为 video_new.srt
    output_subtitle="$input_dir/${base_name}_new.srt"

    # 检查参考字幕和待修正字幕是否存在
    if [[ -f "$ref_subtitle" && -f "$nosync_subtitle" ]]; then
        # 调用第三方工具修正字幕
        srt-fuzzy-sync run-sync -r "$ref_subtitle" -t "$nosync_subtitle" -o "$output_subtitle"
        echo "Processed: $mkv_file -> $output_subtitle"
    else
        echo "Missing subtitles for: $mkv_file"
    fi
done

使用说明
将上面的脚本保存为 fix_subtitles.sh
确保脚本具有可执行权限,可以通过以下命令设置:
chmod +x fix_subtitles.sh
运行脚本:
bash ./fix_subtitles.sh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants