批量重命名电视剧

批量重命名电视剧

我的 iTunes 库位于 NAS (WD MyCloud 4TB) 上,我有很多电视剧,通常由 iTunes 库组织:

“电视节目”文件夹:

TV Show 1

|------------- Series 1
               |-----------01 Episode Name.m4v
               |-----------02 Episode Name.m4v
               |...
|------------- Series 2
               |-----------01 Episode Name.m4v
               |...
|...
TV Show 2
|------------- Series 1
               |-----------01 Episode Name.m4v
               |-----------02 Episode Name.m4v
               |...
|------------- Series 2
               |-----------01 Episode Name.m4v
               |...
|...

我已将整个 TV 文件夹硬链接到另一个名为 Infuse 的文件夹。此文件夹将由我的 Apple TV 上的 Infuse 应用程序读取 [这使我可以绕过永久打开 iTunes 的计算机],因此我需要重命名所有硬链接文件,如下所示:

TV Show 1
|------------- Series 1
               |-----------TV Show 1 - S0101 Episode Name.m4v
               |-----------TV Show 1 - S0102 Episode Name.m4v
               |...
|------------- Series 2
               |-----------TV Show 1 - S0201 Episode Name.m4v
               |...
|...
TV Show 2
|------------- Series 1
               |-----------TV Show 2 - S0101 Episode Name.m4v
               |-----------TV Show 2 - S0102 Episode Name.m4v
               |...
|------------- Series 2
               |-----------TV Show 2 - S0201 Episode Name.m4v
               |...
|...

到目前为止我已经找到了解决方案(例如电视节目 1,第 1 季文件夹):

cd进入每个节目的每个季节文件夹并运行

for f in *; do mv $f "TV Show 1 E01S$f"; done

但这真的很耗时,因为我需要

cd ../Season 2/
for f in *; do mv $f "TV Show 1 E02S$f"; done
cd ../Sesaon 3/

...

cd ../../TV Show 2/Season 1/
for f in *; do mv $f "TV Show 2 E01S$f"; done
...

我理想地想要的是编写脚本,从祖父母目录中提取姓名,从父目录中提取季节编号,这样我就可以编写一个简短的 bash 脚本并运行它。就像是:

#!/bin/bash
a=[TV Show folder]
b=[Season folder]
c=[each episode]

for c in each a/b/
mv $c "$a - S0$bE$c"    (or)   rename $c "$a - S0$bE$c"
done

你能帮我用一些for循环或特定命令来实现它吗?

答案1

最近做了一些非常类似的事情,我已经有了一个脚本。

for f in */*/*
do
  destdir=${f%/*}
  tvshow=${f%%/*}
  season=${destdir#*/}
  episode=${f##*/}
  # Get season number
  seasonnum=${season##* }

  dest=$(printf "%s/%s - S%02iE%s" "$destdir" "$tvshow" $seasonnum "$episode")
  echo "mv -- \"$f\" \"$dest\""
  # mv -- "$f" "$dest"
done

答案2

zsh

autoload zmv # best in ~/.zshrc
zmv -n '(*)/(Series (<->))/(<->)(*)' '$1/$2/$1 - S${(l:2::0:)3}E${(l:2::0:)4}$5'

(高兴时删除-n)。

  • <->用于<x-y>数字xtoy但既没有x也没有y提供,所以任何(十进制)数字。
  • ${(l:2::0:)var}:宽度为 2 的左焊盘,带0s

perl相同rename

rename -n 's{./(.*)/Series (\d+)/\K\d+}{
             sprintf "%s - S%02dE%02d", $1, $2, $&}se' ./*/*/*

相关内容