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

Posted on in Categories last updated July 3, 2010

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

You can use the find command 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.

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.

Shell -s option

However, use can pass -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

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.

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

Leave a Comment