批处理文件重命名w / filename的移位

我有很多以这种方式命名的文件: [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3 。 如何将[name][phonenumber]移到文件名的末尾,并以yyyy-MM-dd_HH-mm-ssforms将日期放在开头,这样我就得到了yyyy-MM-dd_HH-mm-ss_[name]_[phonenumber]

这是一个实际的文件名: [Unknown]_[+74999519075]_18-01-36_17-01-2014.mp3

我试过rename ,但由于缺乏正则表达式的知识,我没有提出一个有效的解决方案。

这应该工作:

 for i in *mp3; do rename 's/(.+?)_(.+?)_(.+?)-(.+?)-(.+?)_(.+?)-(.+?)-(.+?).mp3/$8-$7-$6_$3-$4-$5_$1_$2.mp3/' "$i"; done 

括号捕获模式。 第一个捕获的匹配是$1 ,第二个$2等等。所以,上面的命令:

  • 会找到第一个_
  • .+? 意味着匹配最短的模式,因为?
  • 然后一切都到第二_
  • 并相应地重命名。

我测试了它:

 $ touch [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3 $ ls [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3 $ for i in *mp3; do rename 's/(.+?)_(.+?)_(.+?)-(.+?)-(.+?)_(.+?)-(.+?)-(.+?).mp3/$8-$7-$6_$3-$4-$5_$1_$2.mp3/' "$i"; done $ ls yyyy-MM-dd_HH-mm-ss_[name]_[phonenumber].mp3 

只是使用你的例子,如果我们将下划线视为保留分隔符,你可以像这样重命名它们:

 rename 's/^([^_]+)_([^_]+)_([^_]+)_(\d+)-(\d+)-(\d+)/$6-$5-$4_$3_$1_$2/' *.mp3 -vn 

最后的-vn意味着它只会告诉你它在现实世界中会做些什么。 删除它以使其运行。


这是我的测试工具使用您的示例:

 $ rename 's/^([^_]+)_([^_]+)_([^_]+)_(\d+)-(\d+)-(\d+)/$6-$5-$4_$3_$1_$2/' *.mp3 -vn [Unknown]_[+74999519075]_18-01-36_17-01-2014.mp3 renamed as 2014-01-17_18-01-36_[Unknown]_[+74999519075].mp3