我有大量以此方式命名的文件:[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