Man 7 glob
GLOB(7) Linux Programmer's Manual GLOB(7)
glob — Globbing pathnames
Long ago, in Unix V6, there was a program /etc/glob that would expand wildcard patterns. Soon afterwards this
became a shell built-in.
These days there is also a library routine glob(3) that will perform this function for a user program.
The rules are as follows (POSIX.2, 3.13).
A string is a wildcard pattern if it contains one of the characters '?', '*' or '['. Globbing is the operation
that expands a wildcard pattern into the list of pathnames matching the pattern. Matching is defined by:
A '?' (not between brackets) matches any single character.
A '*' (not between brackets) matches any string, including the empty string.
An expression "[…]" where the first character after the leading '[' is not an '!' matches a single character,
namely any of the characters enclosed by the brackets. The string enclosed by the brackets cannot be empty;
therefore ']' can be allowed between the brackets, provided that it is the first character. (Thus, "[!]"
matches the three characters '[', ']' and '!'.)
There is one special convention: two characters separated by '-' denote a range. (Thus, "[A-Fa-f0-9]" is equiva‐
lent to "[ABCDEFabcdef0123456789]".) One may include '-' in its literal meaning by making it the first or last
character between the brackets. (Thus, "-]" matches just the two characters ']' and '-', and "[ — 0]" matches
the three characters '-', '.', '0', since '/' cannot be matched.)
An expression "[!…]" matches a single character, namely any character that is not matched by the expression
obtained by removing the first '!' from it. (Thus, "[!]a-]" matches any single character except ']', 'a' and
One can remove the special meaning of '?', '*' and '[' by preceding them by a backslash, or, in case this is part
of a shell command line, enclosing them in quotes. Between brackets these characters stand for themselves.
Thus, "[[?*]" matches the four characters '[', '?', '*' and ''.
Globbing is applied on each of the components of a pathname separately. A '/' in a pathname cannot be matched by
a '?' or '*' wildcard, or by a range like "[.-0]". A range cannot contain an explicit '/' character; this would
lead to a syntax error.
If a filename starts with a '.', this character must be matched explicitly. (Thus, rm * will not remove .pro‐
file, and tar c * will not archive all your files; tar c . is better.)
The nice and simple rule given above: "expand a wildcard pattern into the list of matching pathnames" was the
original Unix definition. It allowed one to have patterns that expand into an empty list, as in
xv -wait 0 *.gif *.jpg
where perhaps no *.gif files are present (and this is not an error). However, POSIX requires that a wildcard
pattern is left unchanged when it is syntactically incorrect, or the list of matching pathnames is empty. With
bash one can force the classical behavior by setting allow_null_glob_expansion=true.
(Similar problems occur elsewhere. E.g., where old scripts have
rm `find . -name "*~"`
new scripts require
rm -f nosuchfile `find . -name "*~"`
to avoid error messages from rm called with an empty argument list.)