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

种子分类移动脚本中,正则匹配if语句始终返回false的问题排查

解决Bash脚本正则匹配剧集文件名失败的问题

我来帮你搞定这个脚本的问题!你的需求是根据文件名里的Sxx/sxx标识自动分类剧集和电影,但当前的正则表达式存在几个小问题,导致无论传入什么文件名,if判断都返回false。咱们一步步拆解修正:

问题出在哪?

  1. 正则里的[s|S]写法错误:方括号[]里的|是普通字符,不是“或”的逻辑,它会匹配s、|、S三个字符,而不是仅匹配大小写S。正确的写法应该是[sS]。
  2. \b单词边界的误区:Bash正则里的\b匹配的是“单词字符(字母、数字、下划线)”和“非单词字符”的边界,但文件名里的分隔符(比如.、-、_)和S01的组合可能并不符合你预期的边界规则,反而会导致匹配失败。
  3. 多余的\w*:你不需要匹配Sxx后面的任意单词字符,核心只要确认文件名中存在Sxx/sxx模式就足够判断是剧集了。

修正后的完整脚本

#!/bin/bash

# 替换成你实际的文件夹路径
SERIES_DIR="/home/yourname/media/series"
MOVIE_DIR="/home/yourname/media/movies"

# 先检查是否传入了文件名参数
if [[ -z "$1" ]]; then
    echo "Error: 请传入要分类的文件名作为参数!"
    exit 1
fi

# 修正后的正则匹配:匹配任意位置的S/s+两位数字
if [[ "$1" =~ [sS][0-9]{2} ]]; then
    echo "识别为剧集,正在移动到剧集文件夹..."
    mv -- "$1" "$SERIES_DIR/"
else
    echo "识别为电影,正在移动到电影文件夹..."
    mv -- "$1" "$MOVIE_DIR/"
fi

额外优化(可选)

如果需要更严谨的匹配(避免把类似AS01B.mp4这种文件名误判为剧集),可以用下面的正则,确保Sxx前后不是字母数字:

if [[ "$1" =~ (^|[^a-zA-Z0-9])[sS][0-9]{2}([^a-zA-Z0-9]|$) ]]; then

这个正则会匹配:

  • 文件名开头就有Sxx,或者Sxx前面是非字母数字字符(比如.、_、空格)
  • Sxx后面是字母数字以外的字符,或者是文件名结尾

这样能更好地适配标准的剧集命名格式(比如Breaking.Bad.S05E16.mp4)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:22:22