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