当输入包含特殊字符(元字符)的部分文件名时,shell可以生成与已有文件名匹配的文件名。这些字符称为通配符(wildcard)就像扑克牌中的王牌一样无所不能。包含特殊字符的文件名称为模糊文件引用(ambiguous file reference),因为它们不引用任何一个特定文件。对这些文件名操作的过程称为扩展路径名(path expansion)或者通配(globbing)。
1、特殊字符“?”
问号(?)是shell生成文件名的特殊字符,它与已有文件名中的某个字符匹配。
示例:使用ls
$ ls
mem memo12 memo9 memomax newmemo5 memo memo5 memoa memos
$ ls memo?
memo9 memo5 memoa memos
问号也可以放在模糊文件引用的中间:
$ ls mem?max
memomax
2、特殊字符“*”
星号(*)的功能与问号相似,不同的地方在于,星号后面可以与文件名中的任意多个(包括0个)字符匹配。
$ ls
amemo memoalx.0612 memosally memosam user.memo memo memoa
memo.0620 sallymemo memalx memorandum memoalx.keep typescript
$ ls memo*
memoalx.0612 memosally memosam memo memoa memo.0620 memorandum memoalx.keep
$ ls *mo
amemo user.memo memo sallymemo
$ ls *sam*
memosam
3、特殊字符"[ ]"
用一对方括号将一个字符列表括起来使得shell与包含每一个字符的文件名进行匹配。“memo?”可匹配memo后跟任何一个字符的文件名,而方括号更严格些,memo[17a]仅与memo1、memo7和memoa匹配。
在字符类定义中,将连字符放在方括号中可以定义一个字符范围。如[6-9]代表[6789],[a-z]代表所有小写英文字母。[a-zA-Z]代表所有英文字母。
左方括号后直接跟感叹号(!)或插入符号(^)也可以定义字符集,该类与任何不在方括号内的字符匹配。
[^tsq]*表示不以t、s和q开头的文件名匹配。
$ ls
aa ab ac ad ba bb bd be cc dd
$ ls *[^ab]
ac ad bd be cc dd
$ ls [^b-d]*
aa ab ac ad