|Linux / Unix Command: glob|
NAMEglob - Globbing pathnames
DESCRIPTIONLong 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.
WILDCARD MATCHINGA 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.
Character classesAn 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 `!'.)
RangesThere 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 characters `-', `.', `/'.)
ComplementationAn 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 `\'.
PATHNAMESGlobbing 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 .profile, and `tar c *' will not archive all your files; `tar c .' is better.)
EMPTY LISTSThe 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 *.jpgwhere 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 behaviour 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.)
SEE ALSOsh(1), glob(3), fnmatch(3), locale(7), regex(7)
Important: Use the man command (% man) to see how a command is used on your particular computer.