Process the output of find with a block of commands:
find . -type f -print0 | while IFS= read -r -d '' file; do
mv "$file" "${file// /_}"
done
NOTE: This reads one filename at a time from the find command and renames the file, replacing spaces with underscores.
-print0: uses NUL bytes as filename delimiters.
-d '': Instructs it to read all text into the file variable until it finds a NUL byte.
By default, find and read delimit their input with newlines; however, since filenames can potentially contain newlines themselves, this default behavior will split up those filenames at the newlines and cause the loop body to fail.
IFS= : Set to an empty string, because otherwise read would still strip leading and trailing whitespace.
|: Pipe the output from the find command into the while loop.
This places the loop in a “sub shell”, which means any state changes you make (changing variables, cd, opening and closing files, etc.) will be lost when the loop finishes.
To avoid that, use a
Process Substitution - which makes the output of the command_list appear as a filename:
>(command_list)
<(command_list)
-