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)

Original source

Related problems