批处理文件重命名w / filename的移位
我有很多以这种方式命名的文件: [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3
。 如何将[name]
和[phonenumber]
移到文件名的末尾,并以yyyy-MM-dd_HH-mm-ss
forms将日期放在开头,这样我就得到了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