Stan Hoeppner wrote: > I'm not very skilled at writing shell scripts. > > #! /bin/sh > for k in $(ls *.JPG); do convert $k -resize 1024 $k; done
First off don't use ls to list files matching a pattern. Instead let the shell match the pattern. #! /bin/sh for k in *.JPG; do convert $k -resize 1024 $k; done I never like to resize in place. Because then if I mess things up I can lose resolution. So I recommend doing it to a named resolution file. Do anything you like but this would be the way I would go. for k in *.JPG; do convert $k -resize 1024 $(basename $k .JPG).1024.jpg done And not wanting to do the same work again and again: for k in *.JPG; do base=$(basename $k .JPG) test -f $base.1024.jpg && continue # skip if already done convert $k -resize 1024 $base.1024.jpg done > I use the above script to batch re-size digital camera photos after I > dump them to my web server. It takes a very long time with lots of new > photos as the server is fairly old, even though it is a 2-way SMP, > because the script only runs one convert process at a time serially, > only taking advantage of one CPU. The convert program is part of the > imagemagick toolkit. > > How can I best modify this script so that it splits the overall job in > half, running two simultaneous convert processes, one on each CPU? > Having such a script should cut the total run time in half, or nearly > so, which would really be great. GNU xargs has an extension to run jobs in parallel. This is already installed on your system. (But won't work on other Unix systems.) for k in *.JPG; do echo $k; done | xargs -I{} -P4 echo convert {} -resize 1024 {} Verify that does what you want and then remove the echo. unfortunately that simple approach is harder to do with my renaming scheme. So I would probably write a helper script that did the options to convert and renamed the file and so forth. for k in *.JPG; do base=$(basename $k .JPG) test -f $base.1024.jpg && continue # skip if already done echo $k; done | xargs -L1 -P4 echo my-convert-helper And my-convert-helper could take the argument and apply the options in the order needed and so forth. Adjust 4 in the above to be the number of jobs you want to run on your multicore system. Note that in Sid in the latest coreutils there is a new command 'nproc' to print out the number of cores. Or you could get it from grep. grep -c ^processor /proc/cpuinfo All of the above is off the top of my head and needs to be tested. YMMV. But hopefully it will give you some ideas. HTH, Bob
signature.asc
Description: Digital signature