#!/bin/bash
# Rename.sh : Foramt the file name by rules
readonly iLog="./Rename.log" # 扫描日志
readonly eLog="./Rename.err"
readonly debug=false
readonly stdName="(^|[[:space:]])[2,1][0,9][0,1,2,7,9][0-9][0-1][0-9][0-3][0-9]-[0-2][0-9][0-5][0-9][0-5][0-9]($|[[:space:]])" # 标准格式
readonly er1Name="[0,3-9][0-9]{16,}" # 超长数字,提前过滤避免被错误解析
readonly er2Name="[0-9]{18,}" # 异长数字,提前过滤避免被错误解析
readonly er3Name="(^|[[:space:]])-[0-9]{6,}" # 长负数,提前过滤避免被错误解析
readonly minTime=$(date -d '2000-01-11 22:33:44' +%s) # 不存在比这个时间更早的文件
readonly nt1Name="[2,1][0,9][0,1,7,9][0-9][0-1][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9][0-5][0-9]" # 包含 20090516_105959
readonly nt2Name="[2,1][0,9][0,1,7,9][0-9][0-1][0-9][0-3][0-9][0-2][0-9][0-5][0-9][0-5][0-9]" # 包含 20180916112233
readonly nt3Name="[2,1][0,9][0,1,7,9][0-9]_[0-1][0-9]_[0-3][0-9]_[0-2][0-9]_[0-5][0-9]_[0-5][0-9]" # 包含 2018_09_16_11_22_33
readonly nt4Name="[2,1][0,9][0,1,7,9][0-9]-[0-1][0-9]-[0-3][0-9] [0-2][0-9][0-5][0-9][0-5][0-9]" # 包含 2009-05-16 223344
readonly nt5Name="[2,1][0,9][0,1,7,9][0-9]-[0-1][0-9]-[0-3][0-9]-[0-2][0-9]-[0-5][0-9]-[0-5][0-9]" # 包含 2018-09-16-11-22-33
readonly secName="[1,9][0-9]{8,9}" # 包含秒级时间戳,支持2000年之后
find /volume1/homes/{higkoo,anglix}/Drive/{Backup,Moments} ! -path "*@eaDir*" -type f | while read -r sPath; do
unset fName fExt nName rCode rMove tStr
fExt="${sPath##*.}"
[[ ${fExt,,} =~ "png" ]] && continue # 丢弃截图
[[ ${sExt,,} == "jpeg" ]] && sExt='jpg' # 将jpeg后缀改为jpg
fName="${sPath##*/}" && fName="${fName%%.*}"
if [[ $fName =~ $stdName ]]; then # case 的正则弱于 [[ ]] ,所以这里使用 if 嵌套
rCode=0 && rMove=false && echo -ne '.'
elif [[ $fName =~ $er1Name || $fName =~ $er2Name || $fName =~ $er3Name ]]; then
rCode='A' && rMove=false && echo -ne '#'
echo "$sPath" >> ${eLog}
elif [[ $fName =~ $nt1Name ]]; then
rCode=1 && rMove=true && echo -ne "$rCode"
nName="${BASH_REMATCH[0]/_/-}"
elif [[ $fName =~ $nt2Name ]]; then
rCode=2 && rMove=true && echo -ne "$rCode"
nName="${BASH_REMATCH[0]:0:8}-${BASH_REMATCH[0]:8:6}"
elif [[ $fName =~ $nt3Name ]]; then
rCode=3 && rMove=true && echo -ne "$rCode"
nName="${BASH_REMATCH[0]//_/}" && nName="${nName:0:8}-${nName:8:6}"
elif [[ $fName =~ $nt4Name ]]; then
rCode=4 && rMove=true && echo -ne "$rCode"
nName="${BASH_REMATCH[0]//-/}" && nName="${nName/ /-}"
elif [[ $fName =~ $nt5Name ]]; then
rCode=5 && rMove=true && echo -ne "$rCode"
nName="${BASH_REMATCH[0]//-/}" && nName="${nName:0:8}-${nName:8:6}"
elif [[ $fName =~ $secName ]]; then
tStr="${BASH_REMATCH[0]}"
if [[ $tStr -le $minTime || $tStr -ge $(date +%s) ]]; then
rCode='B' && rMove=false && echo -ne '-'
echo "$sPath" >> ${eLog}
else
rCode=8 && echo -ne "$rCode"
nName="$(date -d @$tStr +%Y%m%d-%H%M%S)"
fi
else
rCode='E' && echo -ne '*'
echo "$sPath" >> ${eLog}
continue
fi
$rMove && mv -v "${sPath}" "${sPath%/*}/${nName}.${fExt,,}" >>${iLog} 2>>${eLog}
$debug && declare -p rCode BASH_REMATCH && exit 0
done