Regex 更改文件名日期格式

Regex 更改文件名日期格式,regex,bash,shell,rename,batch-rename,Regex,Bash,Shell,Rename,Batch Rename,我有一些文件无法被filebot识别,因为它们具有以下命名方案 SOAP 3rd Oct 2018 part 1 1080p (USER) [GROUP].mp4 (改名) 然而,Filebot确实认识到这种命名方案,并且需要 SOAP 2018 10 01 Part 1 (USER) [GROUP].mp4 我需要一个脚本,可以根据该日期格式重命名这些文件。我已经试着读过正则表达式,但它已经超出了我的理解范围。我想了解如何解决这个问题。使用从here字符串中读取将文件名解析为字段,然后使用

我有一些文件无法被filebot识别,因为它们具有以下命名方案

SOAP 3rd Oct 2018 part 1 1080p (USER) [GROUP].mp4
(改名)

然而,Filebot确实认识到这种命名方案,并且需要

SOAP 2018 10 01 Part 1 (USER) [GROUP].mp4

我需要一个脚本,可以根据该日期格式重命名这些文件。我已经试着读过正则表达式,但它已经超出了我的理解范围。我想了解如何解决这个问题。

使用
从here字符串中读取
将文件名解析为字段,然后使用
日期
重新格式化

更新以处理日期之前元素之间的空格


2018年10月3日
!=
2018 10 01
文件名格式中是否有空格和括号?你能展示两种类型的真实文件名的例子吗<代码>加冕街2018年11月2日第2部分1080p(Deep61)[WWRG]。mp4关注的是硬部分。Cameron,需要我删除分辨率和升级部分吗?硬部分可以
Emmerdale 2018年10月1日1080p(Deep61)[WWRG].mp4
。如果(Deep61)[WWRG]被移除,这将是完美的。额外的好处是将其移动到一个已处理的文件夹中。顺便说一句,它工作得非常好。在运行脚本之前,这个奇怪的文件在[WWRG]和.mp4之间有一个空格,这仍然存在,但这不是问题。不适用于2018年11月2日加冕街第2部分1080p(Deep61)[WWRG]。mp4
$: for f in *mp4
   do IFS='!' read a date b <<< "$( echo "$f" | sed -E '
        s/^(.+) ([0-9]{1,2})[snrt][tdh] ([JFMASOND][aepuco][nbrylgptvc]) ([0-9]{4}) (.*)/\1!\3-\2-\4!\5/' )"
      newName="$( date -d "$date" +"$a %Y %m %d $b" )"
      echo "'$f' -> '$newName'"
      mv "$f" "$newName"
      ls -1 "$newName"
   done
'Coronation Street 2nd Nov 2018 part 2 1080p (Deep61) [WWRG].mp4' -> 'Coronation Street 2018 11 02 part 2 1080p (Deep61) [WWRG].mp4'
'Coronation Street 2018 11 02 part 2 1080p (Deep61) [WWRG].mp4'
'SOAP 3rd Oct 2018 part 1 1080p (USER) [GROUP].mp4' -> 'SOAP 2018 10 03 part 1 1080p (USER) [GROUP].mp4'
'SOAP 2018 10 03 part 1 1080p (USER) [GROUP].mp4'
for f in *mp4
do if [[ "$f" =~ ^(.+)\ ([0-9]{1,2})[snrt][tdh]\ ([JFMASOND][aepuco][nbrylgptvc])\ ([0-9]{4})\ (.*) ]]
   then echo "with Bash Match: "
        newName="$( date -d "${BASH_REMATCH[3]}-${BASH_REMATCH[2]}-${BASH_REMATCH[4]}" +"${BASH_REMATCH[1]} %Y %m %d ${BASH_REMATCH[5]}" )"
        echo "oldName:'$f' -> newName:'$newName'"
   else echo skipping "'$f'"
   fi
done