I want to rotate all the images in a directory that match a pattern.

So far I have:

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 file+'_rotated'.JPG

but that gives no output?


There are quite a few issues with your code. First of all, you are parsing ls which is a Bad Idea. You also need to refer to the variable as $file as you point out and you should also quote it so it won't break on spaces. You are declaring num but it is never used. A safer way would be:

find /tmp/p/ -name "DSC*.JPG" | while IFS= read -r file; do
  convert "$file" -rotate 90 "$file"_rotated.JPG

This will still have problems if your files contain newlines but at least will not break if your path contains spaces.

If the files are all in the same directory, it can be further simplified using globbing. You can also use parameter expansion to create foo_rotated.JPG1 instead of foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
| improve this answer | |
  • 2
    Your method will create original_filename.JPG_rotated.JPG". adding "${file%.JPG}"_rotated.JPG will be more appropriate imho. Cheers! – Valentin Bajrami Sep 29 '13 at 17:39
  • 1
    @val0x00ff absolutely (and I upvoted your answer which suggests that). I just repeated the exact thing the OP was doing fixing the more glaring errors. – terdon Sep 29 '13 at 18:11
  • cool! I just modified your command a little. – Valentin Bajrami Sep 29 '13 at 18:19

mogrify -rotate 90 *.jpg The better One-Liner for rotating all images with imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG will infact rotate all .JPG beginning with DSC in the p directory

Mogrify (part of imagemagick) differs from Convert in that it modifies the original file http://www.imagemagick.org/script/mogrify.php

| improve this answer | |
  • Not true. Mogrify "is similar to magick convert except that the original image file is overwritten (unless you change the file suffix with the -format option) with any changes you request". – Nikos Apr 30 at 12:43

A simple method using PE (Parameter Expansion) is

for f in /tmp/p/DSC*.JPG
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
| improve this answer | |
  • 1
    It should be noted that there's nothing bash specific in there, it's perfectly standard POSIX sh syntax. – Stéphane Chazelas Sep 29 '13 at 19:39

Not an imagemagic solution, but

sips -r 90 *.JPG

will rotate all images ending in .JPG 90 degrees. It's a good one liner.

| improve this answer | |
  • 1
    fwiw, this overwrites the original images. – don_crissti Sep 8 '15 at 16:46

Do not parse ls and the ls is not required here. Furthermore, you should quote your variables in case they contain spaces.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
| improve this answer | |
  • space... or tabs, or newline or asterisk or question mark or square bracket... – Stéphane Chazelas Sep 29 '13 at 19:41

I needed to refer to the file as $file, i.e.

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 $file+'_rotated'.JPG
| improve this answer | |

You can copy/paste this code in ubuntu, and save it as "rotate.sh"

#!/bin/bash -e

cd "${1}"

for file in *.jpg; do
    convert "${file}" -rotate 90 "${file}";


After saving this file, run it from terminal using ./rotate.sh folder_containing_images

| improve this answer | |

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.