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,但由于缺乏正则表达式知识,我没有想出一个可行的解决方案。
这应该有效:
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)
仅使用您的示例,如果我们将下划线视为保留分隔符,您可以像这样重命名它们:
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)