Skip to content
Vidar Holen edited this page Oct 4, 2015 · 4 revisions

Missing ';' or + terminating -exec. You can't use |/||/&&, and ';' has to be a separate, quoted argument.

Problematic code:

find . -type f -exec shellcheck {} | wc -l \;
find . -exec echo {} ;

Correct code:

find . -type f -exec sh -c 'shellcheck "$1" | wc -l' -- {} \;
find . -exec echo {} \;

Rationale:

find -exec is still subject to all normal shell rules, so all shell features like |, ||, & and && will apply to the find command itself, and not to the command you are trying to construct with -exec.

find . -exec foo {} && bar {} \; means run the command find . -exec foo {}, and if find is successful, run the command bar "{}" ";".

To instead go through each file and run foo file && bar file on it, invoke a shell that can interpret &&:

find . -exec sh 'foo "$1" && bar "$1"' -- {} \;

You can also use find -a instead of shell &&:

find . -exec foo {} \; -a -exec bar {} \;

This will have the same effect (-a is also the default when two commands are specified, and can therefore be omitted).

Exceptions

None

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally