How do I check if a folder has contents?
bash, directory, if-statement
Solution
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)
- Check if the output of the `find` command is empty using `grep -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, and `grep -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), and `grep -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.
Problem
I'm trying to create a Bash script that will delete everything in my `.waste` directory. I have a basic script I wrote but I want it to first check if the `.waste` directory has contents, and if so, to echo out a simple `"Folder already empty!"` message. I'm not too savvy about `if` and `if else` statements, and I don't know what the `[ ]` equation needs to check for presence. Basic code: ``` #! /bin/bash echo "The files have been deleted:" cd /home/user/bin/.waste/ ls rm -rf /home/user/bin/.waste/* ``` (P.S. not sure if the asterisk is correct at the end, I did try the script with it and I recall it deleted everything in the `bin` directory as well)