Your find statement is not creating a variable “file” because it’s missing the first part of the for loop. This:
find ./ -type f \( -iname \*.jpg -o -iname \*.png \) | while IFS= read -r -d '' file; do
should be this:
for file in "$(find ./ -type f \( -iname \*.jpg -o -iname \*.png \))"; do
However, the above command would find all files in current and subdirectories. You can just evaluate current context much more simply. I tested the below, it seems to work.
#! /bin/bash
echo "This script will rename all files in this directory with unique names. Continue? (Y/N)"
read proceed
if [[ "$proceed" == "Y" ]]; then
echo "Proceed"
for file in *.{jpg,JPG,png,PNG}; do
echo "in loop"
echo "$file"
dir=$(dirname "$file")
base=$(basename "$file")
echo "'$dir'/'$base'"
new_name="$dir/$(uuidgen -r)"
echo "Renaming ${file} to ${new_name}"
#mv "$file" "$new_name" #uncomment to actually perform the rename.
done
echo "After loop"
else
echo "Cancelling"
fi
You could also find matching files first, evaluate if anything is found and add a condition to exit if no files are found.



Nice, and good job.
With respect:
I want to be careful here not to discourage you, this is great exploration!
I realize I’m handing out unsolicited advice here, but when I was first learning about Unix/Linux kernels in the Solaris and HP/UX days, the thing that helped the process “click” for me was compiling a kernel and building an ELF. And if you’re going to continue on this journey (which I hope you do), you should probably read a bit on memory segmentation and broadly about assembly instructions.
Good luck!