Mastering Unix Shell For Loops and Find to Automate Batch File Operations
This guide explains how to use Unix shell for‑loops and the find command to batch‑process files, covering basic syntax, practical ImageMagick examples, loop restrictions, variations across shells, and advanced find‑exec techniques for efficient automation.
Classic Loop
A for loop in Bash iterates over a list of items, assigning each item to a variable (commonly f) and executing a series of commands for each iteration. The basic syntax consists of three parts: the variable list, the do block, and the terminating done keyword.
for f in * ;
do file $f ;
doneThe same loop can be written on a single line:
for f in *; do file $f; donePractical Example: Batch Image Resizing
Assume a directory contains many vacation photos that need to be scaled to 33 % of their original size for web use. After installing ImageMagick ( sudo dnf install ImageMagick or sudo apt install ImageMagick), create a destination directory and run a loop that processes every file:
mkdir tmp
for f in * ; do
convert $f -scale 33% tmp/$f
doneMultiple commands can be chained inside the do block. The following loop resizes the image, copies it to a remote host via scp, and then removes the local copy:
for f in * ; do
convert $f -scale 33% tmp/$f
scp -i seth_web tmp/$f [email protected]:~/public_html
rm -f tmp/$f
doneLoop Restrictions and Patterns
To limit processing to specific file types, adjust the glob pattern:
for f in *.jpg ; do
convert $f -scale 33% tmp/$f
doneNumeric ranges can also be used as the iteration list:
for n in {0..4} ; do
echo $n
doneShell Compatibility
The for construct shown above is native to Bash and most POSIX‑compatible shells. Other shells, such as tcsh, use a different keyword ( foreach) and require each keyword on its own line:
foreach f (* )
file $f
endUsing find as an Alternative
The find command can replace a for loop when recursive search or additional filtering is needed. The -exec action runs a command on each matched file. Example: resize only PNG files in the current directory and place the results in tmp:
find . -maxdepth 1 -name "*png" -exec convert {} -scale 33% tmp/{} \;The placeholder {} is replaced by the current file name. The terminating semicolon must be escaped ( \;) so that find interprets it correctly.
Depth control is available via -maxdepth. For example, to search only the top‑level directory: find . -maxdepth 1 -name "*png" Increasing the depth value includes subdirectories:
find . -maxdepth 2 -name "*png"Best Practices
Test loops on a copy of your data before applying them to production files.
Use protective options (e.g., mv -i, rm -i) to avoid accidental data loss.
Prefer explicit glob patterns (e.g., *.jpg) to limit unintended matches.
When using find -exec, remember to escape the terminating semicolon.
Understanding the structure of Bash for loops and the capabilities of find enables efficient batch processing of files, reducing repetitive manual work and minimizing the risk of errors.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
ITPUB
Official ITPUB account sharing technical insights, community news, and exciting events.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
