Linux / UNIX: Check If File Is Empty Or Not Using Shell Script

last updated in Categories , ,

How do I check if a file is empty or not using bash or ksh shell script under a UNIX / Linux / macOS / OS X / BSD family of operating systems? How do I check if a file is empty in Bash?

You can use the find command and other options as follows. The -s option to the test builtin check to see if FILE exists and has a size greater than zero. It returns true and false values to indicate that file is empty or has some data. This page shows how to check if a file is empty in Bash shell running on a Linux or Unix-like operating systems.

Check If File Is Empty Or Not Using Shell Script

The syntax is as follows:

touch /tmp/file1
ls -l /tmp/file1
find /tmp -empty -name file1

Sample outputs:

/tmp/file1

Now create another file with some data in it:

echo "data" > /tmp/file2
ls -l /tmp/file2
find /tmp -empty -name file2

You should not see any output from the find command.

Bash Script – Check If File is Empty or Not With the -s Option

However, one can pass the -s option as follows in script or shell prompt:

touch /tmp/f1
echo "data" >/tmp/f2
ls -l /tmp/f{1,2}
[ -s /tmp/f1 ] 
echo $?

Sample outputs:

1

The non zero output indicate that file is empty.

[ -s /tmp/f2 ]
echo $?

Sample outputs:

0

Bash Shell Check If File Is Empty Or Not on a Linux/Unix
Bash Script/Command – Check If File is Empty or Not

The zero output indicate that file is not empty. So you can write a shell script as follows.

Shell Script To Check If File Is Empty OR Not

#!/bin/bash
_file="$1"
[ $# -eq 0 ] && { echo "Usage: $0 filename"; exit 1; }
[ ! -f "$_file" ] && { echo "Error: $0 file not found."; exit 2; }
 
if [ -s "$_file" ] 
then
	echo "$_file has some data."
        # do something as file has data
else
	echo "$_file is empty."
        # do something as file is empty 
fi

Run it as follows:
chmod +x script.sh
./script.sh /etc/resolv.conf

Sample outputs:

/etc/resolv.conf has some data.

Run it on an empty file:
touch /tmp/test.txt
./script.sh /tmp/test.txt

Sample outputs:

test.txt is empty.

Conclusion

This page showed how to check if file is empty on a Linux or Unix-like operating systems using various commands. See test command for more info.

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Start the discussion at www.nixcraft.com

Historical Comment Archive

6 comment

  1. Given shell script is not executing the then block of the if condition………….it always executing else block, either input file is empty or not…………..

  2. What if you there might be multiple files exist? ex:

    file1, file2, file3

    if [ -s “$file*” ] or if [-s file*]
    do not work
    any suggestions?

    Thanks
    Vivian

  3. @Vivan

    You need to edit the script:

    #!/bin/bash
    [ $# -eq 0 ] && { echo "Usage: $0 file1 file2 fileN"; exit 1; }
    for _file in $@
    do
    [ ! -f "$_file" ] && { echo "Error: $_file file not found."; continue; } 
    if [ -s "$_file" ]
    then
    	echo "$_file has some data."
            # do something as file has data
    else
    	echo "$_file is empty."
            # do something as file is empty 
    fi
    done
  4. This was very helpful, I have it in a script to email me when there are failed login attempts on my servers!

    Still, have a question? Get help on our forum!