10.1.4 通配符
或许这是你第一次听说“通配符”,但实际上你一定用过它,只是你并没有意识到。相信所有人都曾经用过Windows下的文件搜索功能。你可能某一次想找个.doc文件,但是又一时想不起该文件名和放置的位置(确实没有养成归档的好习惯),所以你决定把计算机上所有的.doc文件全部找出来,然后再进行人工挑选,于是你用“*”号来代替该文件的名字,以“.doc”作为扩展名进行第一次搜索,如图10-2所示。
实际上,通配符是一种特殊的语句,主要包含“*”号和“?”号(还有“{}”、“^”、“!”)。主要用来模糊搜索文件,使用它替代一个或多个真正的字符,尤其是在不知道或者不确定完整的文件名时,用来匹配符合条件的文件。
图10-2 搜索doc文件
·“*”符号
这里的“”就是提到的第一个通配符,代表0个或多个字符。那么之前的.doc就是指所有以.doc结尾的文件。如果想要找的文档是以字母A开头,则可用A*.doc来查找。在Linux中,列出当前目录中是否存在以.doc结尾的文件,可以使用以下命令:
- [root@localhost ~]# ls -l .doc
- #
- 该命令执行后,shell
- 先要解析出命令和参数,这里的命令是ls
- ,参数是.doc
- ,
- 一旦发现了*
- 符号,shell
- 就会将*.doc
- 解析成所有匹配的文件名,然后显示结果
·“?”符号
如果要列出以字母A开头、但是只有两个字母的文件名、以.doc结尾的文件,就需要使用“?”了。当它作为通配符使用时,代表的是任意一个字符。其写法如下:
- [root@localhost ~]# ls -l A?.doc
·“{}”符号
“{}”可拥有匹配所有括号内包含的以逗号隔开的字符。例如,下面列出了所有以字母A、B、C开头,以.doc结尾的文件:
- #
- 第一种方法:用“{}
- ”
- [root@localhost ]# ls -l {A,B,C}.doc
- #
- 第二种方法:用“[]
- ”
- [root@localhost ]# ls -l [A-C].doc
- #
- 以上两种方法都能满足题意,但是如果要列出以字母AB
- 或者CD
- 开头、以.doc
- 结尾的文件,
- 就只能用“{}
- ”了,想一想为什么
有意思的是,“{}”还支持嵌套的通配。以“{x,y}”为例,如果x和y各自本身也是通配符,则就变得更强大了,想一想下面例子的含义。
- [root@localhost ~]# ls -l {[A-Z]*.doc,[0-9]??.txt}
·“^”符号和“!”符号
这两个符号往往和“[]”一起使用,当出现在“[]”中的时候,代表取反。所以[^A](或[!A])代表不是A。
可能大家已经认识到,通配符和正则表达式之间存在的一些差异,特别是有些相同的字符既用在正则表达式中又用在通配符中,极易造成混淆和干扰,只有通过多读多想才能加深理解和认识。简要地说,正则表达式主要使用在对文件内容的匹配上,而通配符主要是用在文件名的匹配上,可以用这种方法来帮助区别二者。