====== BASH - Find - Run one or more commands for each of finds results ======
To run a single command for each file found:
find dirname ... -exec somecommand {} \;
----
To run multiple commands in sequence for each file found, where the second command should only be run if the first command succeeds:
find dirname ... -exec somecommand {} \; -exec someothercommand {} \;
----
To run a single command on multiple files at once:
find dirname ... -exec somecommand {} +
----
===== Example usage of running multiple commands against each file returned by find =====
find . -type f -name "*.mp3" -print0 | while IFS= read -r -d '' file; do echo "$file"; [[ $(mp3info -r m -p "%r" "$file") -gt 192 ]] && lame -b 192 "$file" "${file%.*}".192.mp3 && mv "${file%.*}".192.mp3 "$file"; done
**NOTE:** This searches for mp3 files, then checks if their bitrate is greater than 192 kbps; and if so then reduces the bitrate to 192 kbps.
* **IFS=**: Usually the **read** command removes all leading and trailing whitespace characters. This is not wanted here, so this clears this whitespace action.
* The parameters used with **read** are:
* **-r**: Do not treat a backslash as an escape character.
* **-d ''**: Sets the delimiter of the line; i.e. what character is used to terminate the line. Here, the entire line is used.
* This uses the **mp3info** command to determine the bitrate.
* This **mp3info** command needs to be installed with **sudo apt install mp3info**.
----
===== References =====
https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-output-bad-practice?noredirect=1&lq=1