6.6 Filename Expansion
Often you want a command to work with a group of files. Wildcards are used to
create a filename expansion pattern: a series of characters and wildcards that expands
to a list of filenames. For example, the pattern /etc/* expands to a list of
all2
the files in /etc.
* is a wildcard that can stand for any series of characters, so the pattern /etc/*
will expand to a list of all the filenames beginning with /etc/.
This filename list is most useful as a set of arguments for a command.
For example, the /etc directory contains a series of subdirectories called
rc0.d, rc1.d, etc. Normally to view the contents of these, you would type the
following:
-
-
ls /etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d
ls /etc/rc4.d /etc/rc5.d /etc/rc6.d /etc/rcS.d
This is tedious. Instead, you can use the ? wildcard as shown here:
-
-
ls /etc/rc?.d
/etc/rc?.d expands to a list of filenames that begin with rc, followed by any single
character, followed by .d.
Available wildcards include the following:
-
*
- Matches any group of 0 or more characters.
-
?
- Matches exactly one character.
-
[...]
- If you enclose some characters in brackets, the result is a wildcard that
matches those characters. For example, [abc] matches either a, or b, or
c. If you add a ^ after the first bracket, the sense is reversed; so [^abc]
matches any character that is not a, b, or c. You can include a range, such
as [a-j], which matches anything between a and j. The match is case
sensitive, so to allow any letter, you must use [a-zA-Z].
Expansion patterns are simple once you see some concrete examples:
-
*.txt
- This will give you a list of all filenames that end in .txt, since the *
matches anything at all.
-
*.[hc]
- This gives a list of filenames that end in either .h or .c.
-
a??
- This gives you all three-letter filenames that begin with a.
-
[^a]??
- This gives you all three-letter filenames that do not begin with a.
-
a*
- This gives you every filename that starts with a, regardless of how many
letters it has.