I wanted to publish this summary about wildcards in the bash (and similar shells) some time ago, but didn’t finish it. But finally it gets published.

The shell handles words or patterns containing a wildcard as a template. Available filenames are tested to see if they fit this template. This evaluation is also called globbing. Let’s have a look at a small example:

me@kile /tmp/blog $ ls
aaa   aaa2  aaaa1  aaaa3  aaaa5  abbb  bbbb
aaa1  aaa3  aaaa2  aaaa4  aaab   acdc  caab
me@kile /tmp/blog $ ls *b
aaab  abbb  bbbb  caab

In this example * is replaced by appropriate characters, and the list of matching files are passed to the ls command. This set of files will be used in the following examples.

Encode for a single character: `?`

The question mark can be replaced by a single character. So if you want to get the files aaa1 , aaa2 , aaa3 and aaab you can use the following pattern:

me@kile /tmp/blog $ ls aaa?
aaa1  aaa2  aaa3  aaab

So you see, the ? is replaced by exactly one character. That is, both aaa and aaaa1 won’t match.

Encode for a an arbitrary number of characters: `*`

To match any number of characters you can use the asterix * . It can replace 0 to n characters, n is limited by the max length of the file name and depends on the file system you’re using. Adapting the previous snippet you’ll now also get aaa and aaaa1 :

me@kile /tmp/blog $ ls aaa*
aaa  aaa1  aaa2  aaa3  aaaa1  aaaa2  aaaa3  aaaa4  aaaa5  aaab

Encode for a set of characters: `[...]`

Most of the common tasks can be done with the previous templates, but there are cases when you need to define the characters that should be replaced. You can specify this set of characters using brackets, e.g. [3421] can be replaced by 3 , 4 , 2 or 1 and is the same as [1-4] :

me@kile /tmp/blog $ ls aaaa?
aaaa1  aaaa2  aaaa3  aaaa4  aaaa5
me@kile /tmp/blog $ ls aaaa[3421]
aaaa1  aaaa2  aaaa3  aaaa4
me@kile /tmp/blog $ ls aaaa[1-4]
aaaa1  aaaa2  aaaa3  aaaa4

As you can see aaaa5 doesn’t match [3421] , and btw. the order of the specified characters doesn’t matter. And because it would be very annoying if you want to match against any alphabetic character (you would need to type all 26 characters), you can specify character ranges using a hyphen ( a-z ). Here are some exmaples:

TemplateCharacter set
`[xyz1]` `x` , `y` , `z` or `1`
`[C-Fc-f]` `C` , `D` , `E` , `F` , `c` , `d` , `e` or `f`
`[a-z0-9]` Any small character or digit
`[^b-d]` Any character except `b` , `c` , `d`
`[Yy][Ee][Ss]` Case-insensitive matching of yes
`[[:alnum:]]` Alphanumeric characters, same as `A-Za-z0-9`
`[[:alpha:]]` Alphabetic characters, same as `A-Za-z`
`[[:digit:]]` Digits, same as `0-9`
`[[:lower:]]` Lowercase alphabetic characters, same as `a-z`
`[[:upper:]]` Uowercase alphabetic characters, same as `A-Z`
`[[:space:]]` Whitespace characters (space, tab etc.)

Btw. the files that match such a template are sorted before they are passed to the command.


Martin Scharm

stuff. just for the records.


Post a comment

read more about submitting comments