Even when /tmp has no file called something, searching for it with find will return 0:
$ find /tmp -name something
$ echo $?
0
How can I get a non-zero exit status when find does not find anything?
Even when /tmp has no file called something, searching for it with find will return 0:
$ find /tmp -name something
$ echo $?
0
How can I get a non-zero exit status when find does not find anything?
find /tmp -name something | grep .
The return status will be 0 when something is found, and non-zero otherwise.
EDIT: Changed from egrep '.*' to the much simpler grep ., since the result is the same.
* on the egrep regex is completely redundant. Since you are not using egrep regular expression syntax, plain old grep might be a few microseconds faster.
– tripleee
Oct 30 '15 at 13:03
grep -F '' does not use regular expressions at all and results in the same output as grep ..
– XPhyro
Oct 08 '22 at 16:14
find ... | read is perfect for my use case, I wanted it to swallow the output. Anyone who wants the exit code for branching probably doesn't need the output
– Andy
Mar 19 '24 at 13:38
Exit 0 is easy with find, exit >0 is harder because that usually only happens with an error. However we can make it happen:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find doesn't seem to depend on the exit codes of any -execs it ran.
– Chris
Dec 14 '17 at 14:51
if ... else is inverted to handle your concern
– Zombo
May 26 '20 at 22:37
-quit to immediately exit after a file is found.
– Michaël Cadilhac
Jan 02 '21 at 23:36
-quit option to find :s
– brunetton
Apr 29 '21 at 09:13
find depends on the exit code of -exec, the following blurb from the manual is useful: "If any invocation with the + form returns a non-zero value as exit status, then find returns a non-zero exit status."
– tianon
Jul 13 '21 at 21:56
-print in case you also want to list the files..
– Treviño
Mar 29 '23 at 14:57
find zero if something is found? Without ! in front of the find command.
– pmor
Nov 24 '23 at 11:09
0 in your something found block and check for it later.
– Tripp Kinetics
Dec 11 '23 at 13:21
Simplest solution that doesn't print, but exits 0 when results found
find /tmp -name something | grep -q "."
! find /tmp -name badfile | grep -q .
– wisbucky
Feb 13 '20 at 21:23
… || exit 1 or parens with -e, https://stackoverflow.com/q/39581150/450917
– Gringo Suave
Nov 01 '21 at 18:15
grep -q will cause find to likely exit with SIGPIPE, which will be a problem if you use -o pipefail.
– Vladimir Panteleev
Feb 01 '22 at 19:08
Having just found this question whilst trying to find my way to solve a problem with Puppet (change permissions on folders under a directory but not on the directory itself), this seems to work:
test -n "$(find /tmp -name something)"
My specific use case is this:
test -n "$(find /home -mindepth 1 -maxdepth 1 -perm -711)"
Which will exit code 1 if the find command finds no files with the required permissions.
[[ -n "$(...)" ]] if people find that more readable than using test.
– dimo414
Feb 22 '20 at 03:19
[ "$(find ...)" ] && echo Found || echo Not found with single bracket and no -n also works and is portable (POSIX).
– amdn
Aug 27 '21 at 17:38
It's not possible. Find returns 0 if it exits successfully, even if it didn't find a file (which is a correct result not indicating an error when the file indeed doesn't exist).
To quote the find manpage
EXIT STATUS
find exits with status 0 if all files are processed successfully, greater than 0 if errors occur. This is deliberately a very broad description, but if the return value is non-zero, you should not rely on the correctness of the results of find.
Depending on what you want to achieve you could try to let find -print the filename and test against it's output:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec/execdir option (used with +): If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
– Tgr
Apr 20 '19 at 02:12
I feel that this is the most concise and direct method:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit, which might address your concern.
– danorton
Feb 07 '13 at 18:19
test -n? i.e. if the output of find is not empty, return 0 else return 1...?
– jimbobmcgee
Jan 22 '19 at 02:07
test fails because it's a unary operator. This can easily be fixed, though, by surrounding the backtick expression with double quotes.
– IpsRich
Aug 07 '19 at 12:21
Here's a little script I called test.py. It improves upon other methods posted in that it will return an error code if one is set, and it additionally set one if find didn't list any files:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
Here's the command-line output:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Then, for a result where find had errors but found files:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
Then, if you want the list of files you can make use of -print 0 passed to find and split the out variable on nulls, or you can just add a print statement for it.
It is not only find that returns the exit status codes as zero when it successful. In unix what ever the command you execute, if its succeeds then it returns the exit status as zero.
/dev/nullas an extra argument. It is guaranteed to be empty, so if your goal is to runwcthis is particularly helpful. Not an answer for every use case. – Tom Boutell Jul 25 '22 at 18:56