How do I check if a folder has contents?
You can check if a directory is empty using find
, and processing its output:
#!/bin/sh
target=$1
if find "$target" -mindepth 1 -print -quit 2>/dev/null | grep -q .; then
echo "Not empty, do something"
else
echo "Target '$target' is empty or not a directory"
fi
That is:
- Use
find
to find the first filesystem entry under$target
(-mindepth 1
), print it (-print
), and stop processing (-quit
)- Redirect
stderr
to suppress any error messages (= noise)
- Redirect
- Check if the output of the
find
command is empty usinggrep -q .
grep -q .
will exit after processing at most one character. If it sees a character it exits with success, if it doesn't (its input is empty) then it exits with failure.
- If the output of the
find
command is not empty, then the directory is not empty, andgrep -q .
exits with success. - If the output of the
find
command is empty, then$target
is either an empty directory, or not a directory (does not exist), andgrep -q .
exits with failure.
The reason we have to rely on the stdout
of find
rather than its own exit code directly is that there's no way to make the find
command use distinguishable exit codes in case files were found or not.
Instead of piping to grep -q
, another alternative would be to capture the output of find
and check if it's an empty string or not.
#!/bin/sh
target=$1
if [ "$(find "$target" -mindepth 1 -print -quit 2>/dev/null)" ]; then
echo "Not empty, do something"
else
echo "Target '$target' is empty or not a directory"
fi
Capturing command output like this uses a sub-shell.
I think the solution using grep
is probably faster,
but I haven't tested it.
GNU find will let you do this
find . -maxdepth 0 -empty -exec echo {} is empty. \;
pretty quick and no pipes
Sorry, I don't have enough rep to answer Dominik's comment with a comment, so this is the best I can do...
My find on Solaris has no maxdepth option... how can I achieve the same? – Dominik Nov 14 at 12:46
I can't say for sure on earlier versions, but on Solaris 10 or better:
find . ! -name . -prune