How to rotate all images in a directory with imagemagick?

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
done

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
done

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


A simple method using PE (Parameter Expansion) is

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done