将电视节目的文件名重命名并清理为 S01E01.mp4 等

将电视节目的文件名重命名并清理为 S01E01.mp4 等

如果我有一些名字不好的电视节目,我需要清理它们

$ ls
Some_Series.1_Episode.1.mp4  'Some Series01.Episode02.mp4' SomeSeries1Episode03.mp4

我需要将它们批量重命名为

$ ls
S01E01.mp4  S01E02.mp4  S01E03.mp4

我使用了以下脚本并且它有效,但仅当原始文件名包含系列和剧集编号 01 02 03 而不是 1 2 3 时

#!/bin/bash
# rename tv show filenames to be kodi friendly
cd /mnt/2tb_hd/con/
if [ $? == 1 ]; then 
    exit
fi
for filename in *; do
        if [[ "$filename" =~(\**).*(.*[0-9][0-9]).*([0-9][0-9]).*(\....)$ ]]; then
            result=$(echo mv \"$filename\" S${BASH_REMATCH[2]}E${BASH_REMATCH[3]}${BASH_REMATCH[4]}\") 

                if [[ $? == 0 ]] ; then 
                    mv "$filename" "S${BASH_REMATCH[2]}E${BASH_REMATCH[3]}${BASH_REMATCH[4]}"
                fi
            fi
        done
        exit

我需要使此代码在运行第二个重命名循环之前更改文件名中的任何 1 2 3 4 5 等以具有 0 填充,或者仅更改我已经必须更改 01 或 1 的代码,而不管 0 填充如何。

抱歉,如果这看起来很明显,但我是 bash 新手,所以请原谅我。


我已经更新了脚本,现在第 8 集和第 9 集出现问题。出现以下错误

line 10: printf: 08: invalid octal number

因此,第 8 集和第 9 集缺失,但每集超过 7 集的系列都有一个额外文件 S02E00.mkv。

改编后的剧本

#!/bin/bash
# rename tv show files to kodi friendly format S01E01 etc
cd /mnt/2tb_hd/Adults/TV_Shows/Breaking\ Bad/
if [ $? == 1 ]; then 
    exit
fi
reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*).*(\....)$'
for filename in *.*; do
      if [[ $filename =~ $reg ]]; then
              printf -v newname 'S%02dE%02d%s' "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}"
                  mv "$filename" "$newname"
                fi
            done
        exit

http://pastebin.com/2XRH85ua以获得测试运行的完整结果。

答案1

使用printf, 以及指定整数的字段宽度和零填充的格式字符串,例如

printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"

请注意在以下情况下使用 来$((10#${BASH_REMATCH[n]}))强制进行十进制计算09

测试(顺便说一句,我稍微修改了你的正则表达式):

reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*)(\....)$'
for filename in *.mp4; do
  if [[ $filename =~ $reg ]]; then
    printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
    echo mv "$filename" "$newname"
  fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4


使用正则表达式可能更强大仅有的匹配前两个数字序列,并使用 shell 参数替换来处理扩展名:

reg='([0-9][0-9]*)[^0-9]*([0-9][0-9]*)'
for filename in *.mp4 *.mkv; do
  name="${filename%.*}"
  ext="${filename##*.}"
  if [[ $name =~ $reg ]]; then
    printf -v newname 'S%02dE%02d.%s' "$((10#${BASH_REMATCH[1]}))" "$((10#${BASH_REMATCH[2]}))" "${ext}"
    echo mv "$filename" "$newname"
  fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries09Episode10.mp4 S09E10.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
mv Breaking.Bad.S01E01.576p.BluRay.DD5.1.x264-HiSD.mkv S01E01.mkv

或者,如果您的系统有基于 perl 的rename/prename命令,您可以这样

prename -vn -- 's/.*(\d+).*(\d+)/sprintf "S%02dE%02d.mp4", $1, $2/e' *.mp4

相关内容