批量文件重命名,使用文件名的移位

批量文件重命名,使用文件名的移位

我有大量以此方式命名的文件:[name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3。我怎样才能将[name]和移至[phonenumber]文件名末尾,并将日期以 的形式放在开头,yyyy-MM-dd_HH-mm-ss以便获得yyyy-MM-dd_HH-mm-ss_[name]_[phonenumber]

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

我尝试过rename,但由于缺乏正则表达式知识,我没有想出可行的解决方案。

答案1

这应该有效:

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

答案2

仅使用您的示例,如果我们将下划线视为保留分隔符,则可以像这样重命名它们:

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

相关内容