10.1.4 通配符

或许这是你第一次听说“通配符”,但实际上你一定用过它,只是你并没有意识到。相信所有人都曾经用过Windows下的文件搜索功能。你可能某一次想找个.doc文件,但是又一时想不起该文件名和放置的位置(确实没有养成归档的好习惯),所以你决定把计算机上所有的.doc文件全部找出来,然后再进行人工挑选,于是你用“*”号来代替该文件的名字,以“.doc”作为扩展名进行第一次搜索,如图10-2所示。

实际上,通配符是一种特殊的语句,主要包含“*”号和“?”号(还有“{}”、“^”、“!”)。主要用来模糊搜索文件,使用它替代一个或多个真正的字符,尤其是在不知道或者不确定完整的文件名时,用来匹配符合条件的文件。

10.1.4 通配符 - 图1

图10-2 搜索doc文件

·“*”符号

这里的“”就是提到的第一个通配符,代表0个或多个字符。那么之前的.doc就是指所有以.doc结尾的文件。如果想要找的文档是以字母A开头,则可用A*.doc来查找。在Linux中,列出当前目录中是否存在以.doc结尾的文件,可以使用以下命令:


  1. [root@localhost ~]# ls -l .doc
  2. #
  3. 该命令执行后,shell
  4. 先要解析出命令和参数,这里的命令是ls
  5. ,参数是.doc
  6. 一旦发现了*
  7. 符号,shell
  8. 就会将*.doc
  9. 解析成所有匹配的文件名,然后显示结果

·“?”符号

如果要列出以字母A开头、但是只有两个字母的文件名、以.doc结尾的文件,就需要使用“?”了。当它作为通配符使用时,代表的是任意一个字符。其写法如下:


  1. [root@localhost ~]# ls -l A?.doc

·“{}”符号

“{}”可拥有匹配所有括号内包含的以逗号隔开的字符。例如,下面列出了所有以字母A、B、C开头,以.doc结尾的文件:


  1. #
  2. 第一种方法:用“{}
  3. [root@localhost ]# ls -l {A,B,C}.doc
  4. #
  5. 第二种方法:用“[]
  6. [root@localhost ]# ls -l [A-C].doc
  7. #
  8. 以上两种方法都能满足题意,但是如果要列出以字母AB
  9. 或者CD
  10. 开头、以.doc
  11. 结尾的文件,
  12. 就只能用“{}
  13. ”了,想一想为什么

有意思的是,“{}”还支持嵌套的通配。以“{x,y}”为例,如果x和y各自本身也是通配符,则就变得更强大了,想一想下面例子的含义。


  1. [root@localhost ~]# ls -l {[A-Z]*.doc,[0-9]??.txt}

·“^”符号和“!”符号

这两个符号往往和“[]”一起使用,当出现在“[]”中的时候,代表取反。所以[^A](或[!A])代表不是A。

可能大家已经认识到,通配符和正则表达式之间存在的一些差异,特别是有些相同的字符既用在正则表达式中又用在通配符中,极易造成混淆和干扰,只有通过多读多想才能加深理解和认识。简要地说,正则表达式主要使用在对文件内容的匹配上,而通配符主要是用在文件名的匹配上,可以用这种方法来帮助区别二者。