文件名中间加0

文件名中间加0
$ ls
pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3
pro2e_u01_txt_vocabulaire_1_campus.mp3
pro2e_u01_txt_vocabulaire_2_personnes.mp3
pro2e_u01_txt_vocabulaire_3_presentations.mp3
pro2e_u01_txt_vocabulaire_4_identifier.mp3
pro2e_u01_txt_vocabulaire_5_bonjouraurevoir.mp3
pro2e_u01_txt_vocabulaire_6_commentcava.mp3
pro2e_u01_txt_vocabulaire_7_expressionspolitesse.mp3

我想在中间的数字之前添加“0”,以便它们按如下方式排序

$ ls -v
pro2e_u01_txt_vocabulaire_1_campus.mp3
pro2e_u01_txt_vocabulaire_2_personnes.mp3
pro2e_u01_txt_vocabulaire_3_presentations.mp3
pro2e_u01_txt_vocabulaire_4_identifier.mp3
pro2e_u01_txt_vocabulaire_5_bonjouraurevoir.mp3
pro2e_u01_txt_vocabulaire_6_commentcava.mp3
pro2e_u01_txt_vocabulaire_7_expressionspolitesse.mp3
pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3

到目前为止我所拥有的是

$ for i in *.mp3; do echo ${i/_[0-9]_/_0¿_}; done
pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3
pro2e_u01_txt_vocabulaire_0¿_campus.mp3
pro2e_u01_txt_vocabulaire_0¿_personnes.mp3
pro2e_u01_txt_vocabulaire_0¿_presentations.mp3
pro2e_u01_txt_vocabulaire_0¿_identifier.mp3
pro2e_u01_txt_vocabulaire_0¿_bonjouraurevoir.mp3
pro2e_u01_txt_vocabulaire_0¿_commentcava.mp3
pro2e_u01_txt_vocabulaire_0¿_expressionspolitesse.mp3

我不知道应该用什么来代替“¿”,以便匹配 [0-9] 的数字出现在那里。

答案1

有时,一个特定的解决方案就足够了;有时,一个特定的解决方案就足够了。就像在当前情况下,您可以识别要考虑的文件子集的模式(例如/_[0-9]_/)并根据唯一标识前缀添加前导零(例如/re_/)。把所有的放在一起就是:

for f in *_[0-9]_*.mp3 ; do mv -i "${f}" "${f/re_/re_0}" ; done

对于您要求的预检查,您可以echo在 前面添加mv.

答案2

你也可以使用renamefrom 来做到这util-linux一点:

rename vocabulaire_ vocabulaire_0 *vocabulaire_[0-9]_*.mp3

结果:

pro2e_u01_txt_vocabulaire_01_campus.mp3
pro2e_u01_txt_vocabulaire_02_personnes.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3
pro2e_u01_txt_vocabulaire_231_whatever.mp3

如果您希望进一步补零,请重复该命令以增加位数:

rename vocabulaire_ vocabulaire_0 *vocabulaire_[0-9][0-9]_*.mp3

结果:

pro2e_u01_txt_vocabulaire_001_campus.mp3
pro2e_u01_txt_vocabulaire_002_personnes.mp3
pro2e_u01_txt_vocabulaire_012_nationality.mp3
pro2e_u01_txt_vocabulaire_231_whatever.mp3

答案3

for f in ./*.mp3
do    set "${f%_*}" "_${f##*_}"; f=10${1##*_}
      mv "$1$2" "${1%_*}_${f#*$((${#f}<4))}$2"
done

我认为,只要您的数字字段位于最后一个和倒数第二个_分隔字段之间,并且您只想填充到 2 位数字,那么这应该可行。

答案4

对于以下文件:

test0.txt
test1.txt
test2.txt
...
test1234.txt

这对我有用:

rename 's/test([0-9]{1}).txt/test0$1.txt/' *
rename 's/test([0-9]{2}).txt/test0$1.txt/' *
rename 's/test([0-9]{3}).txt/test0$1.txt/' *

结果:

test0000.txt
test0001.txt
test0002.txt
...
test1234.txt

当然,你可以将它包裹在一个循环中。

重要的:如果您的文件以要填充的数字开头或结尾,则必须使用^$来匹配开头和结尾,例如:

rename 's/^([0-9]{1}).txt/0$1.txt/' *

或者

rename 's/test([0-9]{1})$/test0$1/' *

您可以使用rename-n参数来预览更改,而无需实际重命名,例如:

rename -n 's/test([0-9]{1}).txt/test0$1.txt/' *

相关内容