regex - 脚本重命名文件名中包含 08 或 09 的文件失败
问题描述
我一直在尝试使用下面的脚本来链接我的 iTunes 中的所有电视节目,例如:
- ./iTunes/iTunes 媒体/电视节目/新秀蓝/第 5/01 季 Blink.m4v
- ./iTunes/iTunes Media/TV Shows/Haven/Season 3/11 Last Goodbyes.m4v
- ./iTunes/iTunes 媒体/电视节目/神秘博士 (2005)/第 5/10 季文森特和医生.m4v
到格式为 ./TVShows/Show.Name/Season.nn/Show.Name.SnnEnn.Episode.Name.m4v 的新目录,例如:
- ./TVShows/Rookie.Blue/Season.05/Rookie.Blue.S05E01.Blink.m4v
- ./TVShows/Haven/Season.03/Haven.S03E11.Last.Goodbyes.m4v
- ./TVShows/TV Shows/Doctor.Who.2005/Season.05/Doctor.Who.2005.S05E10.Vincent.and.the.Doctor.m4v
#! /bin/bash
srcroot="./iTunes/iTunes Media/TV Shows"
destroot="./TVShows"
for f in "$srcroot"/*/*/*.{m4v,mp4,avi}
do
[[ -f $f ]] || continue
IFS=/ read -a vid <<< "${f// /.}"
vid=( "${vid[@]: -3}" )
show=${vid[0]}
season=${vid[1]}
episode=${vid[2]}
[[ $show =~ \([0-9]{4}\)$ ]] && show=${show: 0:${#show}-6}${show: ${#show}-5:4}
sn=${season#*.}
IFS=. read ep eptitle <<< "${episode%.*}"
ext=${episode##*.}
printf -v hldir -- '%s/%s/%s' "$destroot" "$show" "$season"
printf -v hlname -- '%s.s%02de%02d.%s.%s' "$show" "$sn" "$ep" "$eptitle" "$ext"
echo "from: '$f'"
echo "to: '$hldir/$hlname'"
mkdir -p "$hldir"
ln "$f" "$hldir/$hlname"
echo
done
这个脚本似乎主要做我想做的事,除非它遇到第 08 或 09 集,例如:
- ./iTunes/iTunes Media/TV Shows/12 Monkeys/Season 01/08 Tomorrow.m4v
- ./iTunes/iTunes Media/TV Shows/12 Monkeys/Season 01/09 Yesterday.m4v
链接到:
- ./TVShows/12.Monkeys/Season.01/12.Monkeys.s01e00.Tomorrow.m4v
- ./TVShows/12.Monkeys/Season.01/12.Monkeys.s01e00.Yesterday.m4v
谁能告诉我为什么会这样,我该如何解决?
解决方案
printf %02d 08 09
失败了
bash: printf: 08: invalid octal number
bash: printf: 09: invalid octal number
这是因为以 0 开头的数字被解释为八进制数,而八进制数只能包含字符 0-7。删除前导零。在 bash 中,您可以使用
x=008
printf %02d $((10#$x))
它将数字解释为十进制。
你也可以使用$(printf %s "$x" | sed 's/^00*//')
推荐阅读
- bash - 将自定义可执行 bash 脚本及其 systemd 脚本添加到 Yocto Build
- c# - 如何知道何时单击了当前活动的选项卡项 wpf?
- angular - Angular 6从服务返回值
- sorting - DataTable 最终日期/时间排序 - 使用自定义格式
- sql - 查询中的 SQL MIN 函数 - 3 列访问
- python - 当图形大小更改时,Matplotlib 给出错误的刻度标签值
- r - 删除R中的重复项,更改余数
- vba - 我的快捷键不允许我运行消息框
- sql - JPA条件更新中的Sql Case表达式
- c# - 如何使用 selenium webdriver 提取 UI 标签文本