首页 > 解决方案 > 脚本重命名文件名中包含 08 或 09 的文件失败

问题描述

我一直在尝试使用下面的脚本来链接我的 iTunes 中的所有电视节目,例如:

到格式为 ./TVShows/Show.Name/Season.nn/Show.Name.SnnEnn.Episode.Name.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 集,例如:

链接到:

谁能告诉我为什么会这样,我该如何解决?

标签: regexbashoctal

解决方案


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*//')


推荐阅读