[Chapter 1] 1.16 Wildcards
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:31:16Z

#

| Chapter 1 Introduction |

## 1.16 Wildcards

The shells provide a number of wildcards that you can use to abbreviate filenames or refer to groups of files. For example, let's say you want to delete all filenames in the current directory (1.21) ending in .txt. You could delete these files one by one, but that would be boring if there were only five and very boring if there were a hundred. Instead, you can use a wildcarded name to say, "I want all files whose names end with .txt, regardless of what the first part is." The wildcard is the "regardless" part. Like a wildcard in a poker game, a wildcard in a filename can have any value.

The wildcard you see most often is `*` (asterisk), but we'll start with something simpler: `?` (question mark). When it appears in a filename, the `?` matches any single character. For example, `letter?` refers to any filename that begins with letter and has one character after that. This would include letterA, letter1, as well as filenames with a non-printing character as their last letter, like letter^C.

The `*` wildcard matches any character or group of zero or more characters. For example, `*.txt` matches all files whose names end with .txt, `*.c` matches all files whose names end with .c (by convention, source code for programs in the C language), and so on.

The `*` and `?` wildcards are sufficient for 90 percent of the situations that you will find. However, there are some situations that they can't handle. For example, you may want to list files whose names end with .txt, mail, or let. There's no way to do this with a single `*`; it won't let you exclude the files you don't want. In this situation, use a separate `*` with each filename ending:

>     *.txt *mail *let

Sometimes you need to match a particular group of characters. For example, you may want to list all filenames that begin with digits, or all filenames that begin with uppercase letters. Let's assume that you want to work with the files `program.``n`, where `n` is a single-digit number. Use the filename:

>     program.[0123456789]

In other words, the wildcard `[``character-list``]` matches any single character that appears in the list. The character list can be any group of ASCII characters; however, if they are consecutive (e.g., A-Z, a-z, 0-9, or 3-5, for that matter), you can use a hyphen as shorthand for the range. For example, `[a-zA-Z]` means any alphabetic character.

There is one exception to these wildcarding rules. Wildcards never match `/`, which is both the name of the filesystem root (1.19) and the character used to separate directory names in a path (1.21).

If you are new to computers, you probably will catch on to UNIX wildcarding quickly. If you have used any other computer system, you have to watch out for one very important detail. Virtually all computer systems except for UNIX consider a period (`.`) a special character within a filename. Many operating systems even require a filename to have a period in it. With these operating systems, a `*` does not match a period; you have to say `*.*`. Therefore, the equivalent of `rm *` does virtually nothing on most operating systems. Under UNIX, it is very dangerous: it means "delete all the files in the current directory, regardless of their name." You only want to give this command when you really mean it.

But here's the exception to the exception. The shells and the ls command consider a `.` special if it is the first character of a filename. This is often used to hide initialization files and other files that you aren't normally concerned with; the ls command doesn't show these files unless you ask (16.11) for them. If a file's name begins with `.`, you always have to type the `.` explicitly. For example, `.*rc` matches all files whose names begin with `.` and end with rc. This is a common convention for the names of UNIX initialization files.

Table 1-1 has a summary of the different sorts of wildcards available.

Table 1.1: Shell
Wildcard | Matches
--- | ---
? | Any single character
* | Any group of zero or more characters
[ab] | Either a or b
[a-z] | Any character between a and z, inclusive

Wildcards can be used at any point or points within a path. Remember, wildcards only match names that already exist. You can't use them to create new files (9.4)- though some shells have curly braces (`{}`) (9.5, 15.3) for doing that. Article 1.18 has more about how wildcards are handled.

- ML

1.15 Filenames |  | 1.17 Filename Extensions