$ 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
你也可以使用rename
from 来做到这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/' *