![批量重命名电视剧](https://linux22.com/image/115842/%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E7%94%B5%E8%A7%86%E5%89%A7.png)
我的 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>
数字x
toy
但既没有x
也没有y
提供,所以任何(十进制)数字。${(l:2::0:)var}
:宽度为 2 的左焊盘,带0
s
与perl
相同rename
:
rename -n 's{./(.*)/Series (\d+)/\K\d+}{
sprintf "%s - S%02dE%02d", $1, $2, $&}se' ./*/*/*