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 all6.2 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.

John Goerzen / Ossama Othman