Can you explain me usage of nullglob variable under BASH? How do I check for any *.c files in any directory?
BASH shell has the following two special variables to control pathname expansion. Bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.
a] nullglob : If set, bash allows patterns which match no files to expand to a null string, rather than themselves. This is useful to check for any *.mp3 or *.cpp files in directory.
b] dotglob If set, bash includes filenames beginning with a . in the results of pathname expansion.
How do I set and unset nullglob variable?
Use shopt command to toggle the values of variables. The -s option enable nullglob effects and the -u option disable nullglob option.
shopt -s nullglob # enable shopt -u nullglob # disable
Here is sample shell script to see if *.mp3 exists or not in a directory:
#!/bin/bash old=$(cd) [ $# -eq 0 ] && exit 1 [ -d $1 ] && cd $1 || exit 2 shopt -s nullglob found=0 for i in *.mp3; do echo "File $i found" # or take other action found=1 done shopt -u nullglob [ $found -eq 0 ] && echo "Directory is empty" cd $old
Without nullglob i will expand to *.mp3 only if there are no files in given directory. You can also use GNU find command to find out if directory is empty or not i.e. check for any *.c files in a directory called ~/project/editor:
find ~/project/editor -maxdepth 0 -empty -exec echo {} directory is empty. \;
Where,
- -maxdepth 0: Do not scan for sub directories.
- -empty : File is empty and is either a regular file or a directory.
- -exec echo {} directory is empty. \; : Display message if directory is empty.
Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- My 10 UNIX Command Line Mistakes
- 10 Greatest Open Source Software Of 2009
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- Top 20 OpenSSH Server Best Security Practices
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Linux Video Editor Software
- Email FAQ to a friend
- Download PDF version
- Printable version
- Comment RSS feed
- Last Updated: 03/1/09



{ 3 comments… read them below or add one }
How do you know these things? Either you must have the memory of an elephant, or know how to use google in some magic way :)
One thing I don’t understand is why certain bash variables are stored with shopt and others with environment variables (like IFS). Historic reasons?
I’ve been using UNIX and Linux for over decade so I know lots of things. bash man page has all the info.
shopt use to toggle the values of variables controlling optional behavior. Usually it can be on or off only. On other hand, IFS value can be anything as per users requirements.
Great Lesson,
I was just introduced to this via Vivek. I am planning to use this feature in many ways.
Thanks,
Jaysunn