如果我有一些名字不好的电视节目,我需要清理它们
$ 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