Suppose I have a folder with thousands of photos named all randomly. How can one rename them as photo1, photo2,...,photo1000 from the command-line/terminal?

  • If it's for Photos ( and not other kind of files ), then ExifTool is the tool. – vrdhn May 24 '14 at 3:10

I will assume that you want to keep a proper suffix on the filenames:

c=1; for f in *.jpg ; do mv "$f" "photo$c.jpg" ; c=$(($c+1)) ; done


  • c=1: This initalizes the counter. You can set it to any number you like.

  • for f in *.jpg ; do: This signifies the beginning of a shell for-loop. While much of shell-scripting can be difficult to make work when file names can contain spaces, newlines or other difficult characters, this construction is safe against even the most hostile file names.

  • mv "$f" "photo$c.jpg": This uses the counter c and does the actual renaming of files. The file name $f is in double-quotes to protect the name from the various possible shell expansions.

  • c=$(($c+1)): This increments the counter for the next loop

  • done: The signifies the end of the for loop.

  • 1
    mv "$f" "$(printf 'photo%04d.jpg' $c)" will give all of the files a 4-digit, zero-padded number so that they will sort correctly. – Sammitch May 24 '14 at 0:50

You can use this code :

for i in *.jpg; do let j+=1 ; mv "$i" "photo$j.jpg" ; done
  • 1
    You may want to put $i inside double-quotes to protect it from word splitting in case his file names have spaces or other difficult characters in them. – John1024 May 23 '14 at 19:08
  • @john1024 , that correct , thank you – nux May 23 '14 at 19:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.