One of the most important workflows for our food recipe blog (JamilGhar) is image optimization. My wife uploads images to our GitHub repository and, when prodded, I run a bash script that decreases image sizes and removes extraneous information from the files. The script is a constant work in progress and I have a few posts (1,2) about it on here.

Lately, I have been considering downloading the repository on a Raspberry Pi and running the script as a scheduled job. For that to happen, the job would have to run without errors. My updates today have been a step in that direction.

Simplified .jpg/.jpeg logic

I was handling .jpg and .jpeg files separately. It feels like a naive decision now because the code is less complicated and wordy now just by changing the references to *.jp*g (which can handle either format).

# changed this
find . -maxdepth 1 -type f -size +1M \( -iname \*.jpg -o -iname \*.jpeg \) -exec mv {} optimize/ \;
# to this
find . -maxdepth 1 -type f -size +1M -name "*.jp*g" -exec mv {} optimize/ \;

Terminated job if no images are found

Since running the script was a manual process, I manually verified (or assumed) that there were files to be optimized. This procedure is not fail-safe and would not be suitable for an automated solution.

For this reason, I added an if-else block where I check for optimization candidates before running any operations.

count=`ls -1 *.jp*g 2>/dev/null | wc -l`
if [ $count != 0 ]
then
... 

Complete script

Undoubtedly, there are more changes to come in this script. For now, this feels enough for my purposes.

# This script optimizes and resizes any images in the 'optimize' directory 
# navigate out to the images directory
echo "------Navigating to images dir----------------"
cd ..
# move any JPG files larger than 1 MB to optimize dir
echo "------Finding large files and moving them to optimize dir----------------"
find . -maxdepth 1 -type f -size +1M -name "*.jp*g" -exec mv {} optimize/ \;
# go back to optimize dir
echo "------Navigating to optimize dir----------------"
cd optimize/

echo "------Are there files to modify?----------------"
count=`ls -1 *.jp*g 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
    # backup images
    echo "------Yes, backing up large files----------------"
    find . -maxdepth 1 -type f -name "*.jp*g" -exec cp {} ../../backup/ \;
    # remove file data, optimize file to reduce space
    echo "------Using jpegoptim to strip information----------------"
    jpegoptim *.jp*g --strip-all
    # reduce size
    echo "------Using mogrify to resize----------------"
    mogrify -resize 20% *.jp*g
    # move back to images dir
    echo "------Staging new images----------------"
    find . -maxdepth 1 -type f -name "*.jp*g" -exec mv {} ../ \;
    # push changes
    echo "------Pushing changes----------------"
    # navigate out to root directory
    cd ../../..
    git add *
    git commit -m "optimized images"
    git push
else
    echo "------No images to optimize, aborting----------------"
fi