Search code examples
bashshellunixbatch-rename

renumbering image files to be contiguous in bash


I have a directory with image files that follow a naming scheme and are not always contiguous. 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

I would like to rename them so they go something like this, in the same order:

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

So far this is what I came up, and while it does the four-digit padding, it doesn't sort by the number values in the filenames.

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

result:

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

Solution

  • Update:

    Try this. If output is okay remove 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