Another way to save time in your commands is to use special characters to abbreviate filenames. You can specify many files at once by using these characters. This feature of the shell is sometimes called “globbing.”
MS-DOS provides a few crude features of this type. You can use a question mark to mean “any character” and an asterisk to mean “any string of characters.” Unix provides these wildcards too, but in a more robust and rigorous way.
Let’s say you have a directory containing the following C source files:
$ ls
inv1jig.c inv2jig.c inv3jig.c invinitjig.c invpar.c
To list the three files containing digits in their names, you could enter:
$ ls inv?jig.c
inv1jig.c inv2jig.c inv3jig.c
The shell looks for a single character to replace the question mark.
Thus, it displays inv1jig.c
, inv2jig.c
, and
inv3jig.c
, but not invinitjig.c
because that name
contains too many characters.
If you’re not interested in the second file, you can specify the ones you want using brackets:
$ ls inv[13]jig.c
inv1jig.c inv3jig.c
If any single character within the brackets matches a file, that file is displayed. You can also put a range of characters in the brackets:
$ ls inv[1-3]jig.c
inv1jig.c inv2jig.c inv3jig.c
Now we’re back to displaying all three files. The hyphen means
“match any character from 1 through 3, inclusive.” You could ask
for any numeric character by specifying 0-9
, and any alphabetic
character by specifying [a-zA-Z]
. In the latter case, two
ranges are required because the shell is case-sensitive. The order
used, by the way, is that of the ASCII character set.
Suppose you want to see the init file, too. Now you can use an
asterisk, because you want to match any number of characters between
the inv
and the jig
:
$ ls inv*jig.c
inv1jig.c inv2jig.c inv3jig.c invinitjig.c
The asterisk actually means “zero or more characters,” so if a file
named invjig.c
existed, it would be shown, too.
Unlike MS-DOS, the Unix shells let you combine special characters and
normal characters any way you want. Let’s say you want to look for
any source (.c
) or object (.o
) file that contains a digit.
The resulting pattern combines all the expansions we’ve studied in this
section:
$ ls *[0-9]*.[co]
Filename expansion is very useful in shell scripts (programs), where
you don’t always know exactly how many files exist. For instance, you
might want to process multiple log files named log001
, log002
, and so
on. No matter how many there are, the expression log*
will
match them all.
One final warning: filename expansions are not the same as regular expressions, which are used by many utilities to specify groups of strings. Regular expressions are beyond the scope of this book, but are described by many books that explain Unix utilities. A taste of regular expressions appears in Chapter 13.
Get Running Linux, Third Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.