I'm working on the deployment script for a web application. The original author of the script wrote the following which I don't quite understand.
find */target -name myapp*.jar -exec mv -t $CIRCLE_ARTIFACTS {} + || true
Googling around has got me so far, but I'm still a little unsure with what
{} + || true
is used for.
The {} + suffix is part of the -exec action of find: It substitutes as many arguments as possible (that is, as many files found) on each mv invocation. (There's a limit to "as many as possible" because there's only so much space available in the region the operating system uses to store environment variables and command-line arguments, so if find has many results, multiple mv invocations can be needed even with -exec ... {} +).
Compare to this traditional command:
find */target -name 'myapp*.jar' -exec mv -t "$CIRCLE_ARTIFACTS" {} ';'
This runs mv once per file found. Since /bin/mv is an external executable, this is implicitly expensive.
By contrast,
find */target -name 'myapp*.jar' -exec mv -t "$CIRCLE_ARTIFACTS" {} +
...runs as few mv invocations as possible. (Note that this usage requires the -t extension, which is not specified by POSIX; thus, it's only available on GNU platforms).
Finally, || true is simply a boolean OR operation: If the find fails, then true runs, forcing the command to always result in a truthful result. If you're running with set -e, this prevents the script from being exited in the event of a failure.
This can also be more tersely written as ||:, as : is a synonym for true.
The {} is replaced the filename found by the find command.
So it finds files with the find command, and executes mv for as many files as possible (this is marked by the +).
The || true is a logical OR to the rest of the command, which basically makes sure the command has a zero exit status (which might be important for the rest of the script
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With