换句话说,索引最低的文件应映射到0001.jpg,第二个最低索引应映射到0002.jpg。像这样:
DSCN-1009.JPG --> 1009.JPG
DSCN-1010.JPG --> 1010.JPG
DSCN-101.JPG --> 0101.JPG
DSCN-102.JPG --> 0102.JPG
或
DSCN-1.JPG --> 0001.JPG
DSCN-2.JPG --> 0002.JPG
DSCN-3.JPG --> 0003.JPG
DSCN-4.JPG --> 0004.JPG
我有这段代码,用四位数填充重命名所有文件。
X=1;
for i in *; do
mv "$i" "$(printf %04d.%s "${X%.*}" "${i##*.}")"
let X="$X+1"
done
但文件的排序是关闭的,因为它输出像这样(这不是我想要的):
DSCN-1009.JPG --> 0009.JPG
DSCN-1010.JPG --> 0010.JPG
DSCN-101.JPG --> 0011.JPG
DSCN-102.JPG --> 0012.JPG
答案 0 :(得分:2)
这是基于您的脚本,但只是更改数字的计算方式:
for i in *
do
mv "$i" "$(printf %04d.%s "${i//[^0-9]/}" "${i##*.}")"
done
关键是bash构造${i//[^0-9]/}
。这将从文件名中删除所有非数字。因此,如果i=DSCN-101.JPG
,则${i//[^0-9]/}
变为101
。 printf
命令将零填充数字格式化为四位数。
${i//[^0-9]/}
称为模式替换。在其一般形式中,它看起来像${parameter//pattern/string}
,其中parameter
是变量名称。 pattern
是一些正则表达式。正则表达式pattern
出现在variable
中的任何地方,都被string
取代。在我们的例子中,正则表达式是[^0-9]
,它匹配所有非数字,string
是空字符串。因此,所有非数字都用空字符串替换。