make find fail when nothing was found

If your grep supports reading NUL-delimited lines (like GNU grep with -z), you can use it to test if anything was output by find:

find /some/path -print0 | grep -qz .

To pipe the data to another command, you can remove the -q option, letting grep pass on the data unaltered while still reporting an error if nothing came through:

find /some/path -print0 | grep -z . | ...

Specifically, ${PIPESTATUS[1]} in bash should hold the exit status of grep.

If your find doesn't support -print0, the use grep without -z and hope that newlines in filenames don't cause problems:

find ... | grep '^' | ...

In this case, using ^ instead of . might be safer. If output has consecutive newlines, ^ will pass them by, but . won't.


You ask specifically for a return code... which I don't see in options. But this is how I solved it (because grep -z is not on Mac port):

Gives code 0 if 1 line was found

test 1 == `find */.kitchen/ -name private_key | wc -l`

So...

if [ 0 == `find */.kitchen/ -name my-file.txt | wc -l` ] ; then
   echo "Nothing found"; exit;
fi

Also, as a generic solution, this might be useful:

Check if pipe is empty and run a command on the data if it isn't