Wildcards (
1.16
)
are the shell's way of abbreviating filenames.
Just as in poker,
where a wildcard is a special card that
can match any card in the deck, filename wildcards are capable of
matching letters, or groups of letters, in the alphabet. Rather than
typing a long filename, or a long chain of filenames, a wildcard lets
you provide parts of names, and then use some "wildcard characters" for
the rest. For example, if you want to delete all files whose names
end in
.o
, you can give the command:
%
rm *.o
You don't have to list every filename.
I'm sure you already know that wildcards are useful in many
situations. If not, they are summarized in article
15.2
.
Here are a few of my favorite wildcard applications:
-
If you remember part of a filename, but not the whole name, you can
use wildcards to help you find it. If I have a file on genetics saved
in a directory with several hundred other files, a command like:
%
ls *gene*
will often find what I want. It's quicker and easier than
find
(
17.1
)
.
-
Wildcards are a natural when you want to work with groups of files.
If I have a general purpose directory that's full of filenames ending
in
.c
and
.h
, I can make new subdirectories and use
wildcards to move the files easily:
%
mkdir c h
%
mv *.c c
%
mv *.h h
-
Wildcards often help you to work with files with inconvenient characters in
their names. Let's say you have a file named
abc
x
e
, where
x
is some unknown control character. You can delete or
rename that file by using the wildcarded name
abc?e
. (When you
do this, be careful that your wildcard doesn't match more than you intend.)
-
Wildcards can appear in any component of a pathname. This can often
be used to your advantage. For example, let's say that you have a
directory named
/work
, split into subdirectories for a dozen
different projects. For each project, you have a schedule, in a file
called (obviously enough)
schedule.txt
. You can print all the
schedules with the command:
%
lpr /work/*/schedule.txt
BSD UNIX
%
lp /work/*/schedule.txt
System V UNIX
(However, you can occasionally
run into problems (
15.6
)
.)
It's a common misconception, particularly among new users, that
application programs and utilities have something to do with
wildcards.
Given a command like
grep ident *.c
, many users think
that
grep
handles the
*
and looks to see which files have names
that end in
.c
. If you're at all familiar with UNIX's
workings, you'll realize that this is the wrong picture. The shell
interprets wildcards.
That is, the shell figures out which files have
names ending in
.c
, puts them in a list, puts that list on the
command line, and then hands that command line to
grep
. As it
processes the command line, the shell turns
grep ident *.c
into
grep ident file1.c file2.c ...
.
Since there are several shells, one might think (or fear!) that there
should be several different sets of wildcards. Fortunately, there
aren't. The C shell has made one
significant extension (the
curly brace operators (
9.5
)
),
and the Korn shell has made a few more, but the
basic wildcards work the same for all shells.