使用四位填充重命名所有文件,按文件名中的数字值排序。庆典

时间:2014-10-21 05:16:04

标签: image bash sorting unix batch-rename

换句话说,索引最低的文件应映射到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

1 个答案:

答案 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]/}变为101printf命令将零填充数字格式化为四位数。

${i//[^0-9]/}称为模式替换。在其一般形式中,它看起来像${parameter//pattern/string},其中parameter是变量名称。 pattern是一些正则表达式。正则表达式pattern出现在variable中的任何地方,都被string取代。在我们的例子中,正则表达式是[^0-9],它匹配所有非数字,string是空字符串。因此,所有非数字都用空字符串替换。