我有一个文件列表,如下所示:
pairs10_10.mp3
pairs10_11.mp3
pairs10_12.mp3
pairs10_13.mp3
pairs10_14.mp3
pairs10_15.mp3
pairs10_16.mp3
pairs10_17.mp3
pairs10_18.mp3
pairs10_19.mp3
pairs10_1.mp3
pairs10_2.mp3
pairs10_3.mp3
pairs10_4.mp3
pairs10_5.mp3
pairs10_6.mp3
pairs10_7.mp3
pairs10_8.mp3
pairs10_9.mp3
pairs1_10.mp3
我想要得到类似以下内容的内容,以便稍后对它们进行排序时,它们将按正确的顺序排列:
pairs10_10.mp3
pairs10_11.mp3
pairs10_12.mp3
pairs10_13.mp3
pairs10_14.mp3
pairs10_15.mp3
pairs10_16.mp3
pairs10_17.mp3
pairs10_18.mp3
pairs10_19.mp3
pairs10_01.mp3
pairs10_02.mp3
pairs10_03.mp3
pairs10_04.mp3
pairs10_05.mp3
pairs10_06.mp3
pairs10_07.mp3
pairs10_08.mp3
pairs10_09.mp3
pairs01_10.mp3
我刚刚了解了该rename
命令,但我不知道如何进行这种重命名。
答案1
使用 Perlrename
命令:
rename 's/([0-9]+)_([0-9]+)/sprintf("%02d_%02d",$1,$2)/e' *.mp3
修饰符e
为s
替换运算符意味着替换是 Perl 表达式而不是内插字符串。%02d
函数的格式sprintf
格式化一个只有两位数的整数,并根据需要添加前导零。
或者,使用 zsh 及其numeric_glob_sort
选项。然而,这只适用于 zsh 进行通配操作时(如 中所示play pairs*.mp3
)。
答案2
POSIX:
for f in *;do x=${f#pairs};y=${f#*_};mv $f pairs_$(printf %02d_%02d ${x%_*} ${y%.mp3}).mp3;done
兹什:
autoload zmv;zmv 'pairs(*)_(*).mp3' 'pairs${(l:2::0:)1}_${(l:2::0:)2}.mp3'
答案3
我最终使用了带有重命名命令的多步骤过程。它可能可以简化:
rename 's/(pairs)([0-9])_/$1Z$2_/' *.mp3
rename 's/(_)([0-9])\./$1Z$2\./' *.mp3
rename 's/Z/0/' *.mp3
rename 's/Z/0/' *.mp3
($1和$2指的是第一部分中的括号)
(“Z”只是一个占位符,因为“0”会与“$1”混淆)