种子分类移动脚本中,正则匹配if语句始终返回false的问题排查
解决Bash脚本正则匹配剧集文件名失败的问题
我来帮你搞定这个脚本的问题!你的需求是根据文件名里的Sxx/sxx标识自动分类剧集和电影,但当前的正则表达式存在几个小问题,导致无论传入什么文件名,if判断都返回false。咱们一步步拆解修正:
问题出在哪?
- 正则里的
[s|S]写法错误:方括号[]里的|是普通字符,不是“或”的逻辑,它会匹配s、|、S三个字符,而不是仅匹配大小写S。正确的写法应该是[sS]。 \b单词边界的误区:Bash正则里的\b匹配的是“单词字符(字母、数字、下划线)”和“非单词字符”的边界,但文件名里的分隔符(比如.、-、_)和S01的组合可能并不符合你预期的边界规则,反而会导致匹配失败。- 多余的
\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
相关产品推荐
相关产品推荐

