如何通过插入数字来重命名多个文件

如何通过插入数字来重命名多个文件

我有一个文件列表,如下所示:

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

修饰符es替换运算符意味着替换是 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”混淆)

想法来自https://unix.stackexchange.com/a/147912/86521

相关内容