批处理文件重命名w/文件名的转变

fir*_*run 7 command-line scripts

我有很多这样命名的文件:[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,但由于缺乏正则表达式知识,我没有想出一个可行的解决方案。

ter*_*don 7

这应该有效:

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

括号捕获模式。第一个捕获的匹配是$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
Run Code Online (Sandbox Code Playgroud)


Oli*_*Oli 7

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

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

-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
Run Code Online (Sandbox Code Playgroud)