Thursday, March 5, 2009

Test for empty directory - bash scripting


Lets see how we can check whether a directory is empty or not in bash scripting.

#Create a directory
$ mkdir testdir

#Usual way to check if a directory is empty or not
$ [ -z $(ls testdir/) ] && echo "empty" || echo "NOT"
empty

#Lets create a file in testdir
$ touch testdir/file1

#Oh, it works, great
$ [ -z $(ls testdir/) ] && echo "empty" || echo "NOT"
NOT

#Create one more file, file2
$ touch testdir/file2

#Now see, ohh!!! it has faced some problem
$ [ -z $(ls testdir/) ] && echo "empty" || echo "NOT"
-bash: [: file1: binary operator expected
NOT

#Solution to the above:
$ [ -z "$(ls testdir/)" ] && echo "empty" || echo "NOT"
NOT

#Clear the testdir
$ rm testdir/file*

#So that
$ [ -z "$(ls testdir/)" ] && echo "empty" || echo "NOT"
empty

#Create a hidden file in the testdir
$ touch testdir/.hden

#But the above test condition is not going to take account of hidden files (as we are doing only ls)
$ [ -z "$(ls testdir/)" ] && echo "empty" || echo "NOT"
empty

#So use -A (do not list implied . and ..) option with ls
$ [ -z "$(ls -A testdir/)" ] && echo "empty" || echo "NOT"
NOT

#Create a file
$ touch testdir/file1

#Working ...
$ [ -z "$(ls -A testdir/)" ] && echo "empty" || echo "NOT"
NOT

#Remove the files (including hidden file) from testdir
$ rm testdir/.hden ; rm testdir/file1

#So the above is working.
$ [ -z "$(ls -A testdir/)" ] && echo "empty" || echo "NOT"
empty

But if we use -a option instead of -A
$ [ -z "$(ls -a testdir/)" ] && echo "empty" || echo "NOT"
NOT

This is because:

$ ls -a testdir/
. ..

But
$ ls -A testdir/

-A do not list implied . and ..

If you have any other way, feel free to post a comment. Thanks

1 comment:

rattus said...

http://wooledge.org:8000/BashFAQ/004 has some more.

© Jadu Saikia www.UNIXCL.com