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 1003.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 match-
ing 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 equivalent
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 `[--/]' matches the three char-
acters `-', `.', `/'.)
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 syn-
If a filename starts with a `.', this character must be
matched explicitly. (Thus, `rm *' will not remove .profile,
and `tar c *' will not archive all your files; `tar c .' is
The nice and simple rule given above: `expand a wildcard
pattern into the list of matching pathnames' was the origi-
nal 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 on