将图像文件重新编号为bash中的连续文件

时间:2014-10-22 17:49:55

标签: bash shell unix batch-rename

我有一个目录,其中的图像文件遵循命名方案,并不总是连续的。 E.I:

IMG_33.jpg
IMG_34.jpg
IMG_35.jpg
IMG_223.jpg
IMG_224.jpg
IMG_225.jpg
IMG_226.jpg
IMG_446.jpg

我想重命名它们,所以它们就像这样,按照相同的顺序

0001.jpg
0002.jpg
0003.jpg
0004.jpg
0005.jpg
0006.jpg
0007.jpg
0008.jpg

到目前为止,这是我提出的,虽然它是四位数的填充,但它并没有按文件名中的数字值排序。

#!/bin/bash
X=1;
for i in *; do
  mv $i $(printf %04d.%s ${X%.*} ${i##*.})
  let X="$X+1"
done

结果:

IMG_1009.JPG  0009.JPG
IMG_1010.JPG  0010.JPG
IMG_101.JPG  0011.JPG
IMG_102.JPG  0012.JPG

3 个答案:

答案 0 :(得分:4)

<强>更新

试试这个。如果输出正常,请删除echo

X=1; find . -maxdepth 1 -type f -name "*.jpg" -print0 | sort -z -n -t _ -k2 | while read -d $'\0' -r line; do echo mv "$line" "$(printf "%04d%s" $X .jpg)"; ((X++)); done

答案 1 :(得分:1)

使用超级有用的rename。首先,填充一位数到两位数的文件;然后填充两位数到三位数的文件;等

rename IMG_ IMG_0 IMG_?.jpg
rename IMG_ IMG_0 IMG_??.jpg
rename IMG_ IMG_0 IMG_???.jpg

然后,你重新命名的for循环(或其他类似的东西)就可以了,因为文件按字母和数字顺序排列。

答案 2 :(得分:0)

怎么样:

 while read f1;do 
   echo $f1
   mv IMG_$f1 $f1
 done< <(ls | cut -d '_' -f 2 | sort -n)

感谢 迈克尔