You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash遍历脚本中匹配多文件名模式并批量重命名CBZ文件

Bash批量重命名CBZ漫画文件脚本

以下是一个可扩展的Bash脚本,支持匹配多种命名格式,你可以根据实际的文件命名规则调整正则匹配逻辑:

#!/bin/bash

# 遍历当前目录下的.cbz文件(可替换为你自己的遍历逻辑)
for file in *.cbz; do
    # 跳过非文件对象(比如目录)
    [[ -f "$file" ]] || continue

    # 初始化新文件名变量
    new_name=""

    # --- 规则1:匹配「漫画名 - 第01话.cbz」「漫画名_第01话.cbz」格式 ---
    if [[ "$file" =~ ^([^-_]+)[-_]第([0-9]+)话\.cbz$ ]]; then
        series_name="${BASH_REMATCH[1]}"
        chapter_num="${BASH_REMATCH[2]}"
        # 格式化:去除系列名前后空格,章节号补两位数字
        new_name="$(echo "$series_name" | xargs) - Chapter $(printf "%02d" "$chapter_num").cbz"
    # --- 规则2:匹配「SeriesName_Ch005.cbz」「SeriesName-Ch005.cbz」格式 ---
    elif [[ "$file" =~ ^([^-_]+)[-_]Ch([0-9]+)\.cbz$ ]]; then
        series_name="${BASH_REMATCH[1]}"
        chapter_num="${BASH_REMATCH[2]}"
        new_name="$(echo "$series_name" | xargs) - Chapter $(printf "%02d" "$chapter_num").cbz"
    # --- 规则3:匹配「漫画名_Vol01_Ch03.cbz」卷+章格式 ---
    elif [[ "$file" =~ ^([^_]+)_Vol([0-9]+)_Ch([0-9]+)\.cbz$ ]]; then
        series_name="${BASH_REMATCH[1]}"
        vol_num="${BASH_REMATCH[2]}"
        chapter_num="${BASH_REMATCH[3]}"
        new_name="$(echo "$series_name" | xargs) - Vol $(printf "%02d" "$vol_num") Chapter $(printf "%02d" "$chapter_num").cbz"
    # --- 规则4:添加自定义匹配规则 ---
    # elif [[ "$file" =~ 你的正则表达式 ]]; then
    #     提取对应分组内容并格式化新文件名
    fi

    # 匹配到规则且新文件名不同时,执行重命名(默认预览,确认后启用实际操作)
    if [[ -n "$new_name" && "$new_name" != "$file" ]]; then
        echo "预览重命名:$file -> $new_name"
        # 确认无误后,注释上面的echo,启用下面的mv命令
        # mv -v "$file" "$new_name"
    fi
done

脚本说明

  • 正则匹配逻辑:每个elif块对应一种命名格式,通过=~进行正则匹配,BASH_REMATCH数组存储匹配到的分组内容
  • 格式化处理:
    • echo "$series_name" | xargs 用于去除系列名前后的多余空格
    • printf "%02d" "$chapter_num" 将章节号统一格式化为两位数字(如1→01,12→12)
  • 安全机制:脚本默认只打印重命名预览,确认所有规则匹配正确后,再替换为实际的mv命令执行重命名

自定义规则示例

如果你的文件存在[汉化组] 漫画名 10.cbz这类格式,可以添加如下匹配规则:

elif [[ "$file" =~ ^\[.+\] ([^0-9]+)([0-9]+)\.cbz$ ]]; then
    series_name="${BASH_REMATCH[1]}"
    chapter_num="${BASH_REMATCH[2]}"
    new_name="$(echo "$series_name" | xargs) - Chapter $(printf "%02d" "$chapter_num").cbz"

使用注意

  1. 先在测试目录放入样本文件验证脚本,确保匹配和格式化符合预期
  2. 若需递归遍历子目录,可将for file in *.cbz替换为:
    find . -type f -name "*.cbz" -print0 | while IFS= read -r -d '' file
    

内容的提问来源于stack exchange,提问作者grphine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:18:36