假设您的桌面上有两本书《生物信息学》和《基因组学》,还有两支笔和一个手机。现在让您拿走桌面的书,您就会把两本书《生物信息学》和《基因组学》拿走,而不会去拿笔和手机。这里,"书"是一类事物的统称,代表《生物信息学》和《基因组学》,而不能代表笔和手机。
Shell里的通配符的含义与此类似,就是我们可以用一个包含通配符的模式,代表一类字符串。Shell的通配符有:
* 表示任意个任意字符 ? 表示1个任意字符 [字符集合] 表示方括号中的任意1个字符,如[13579],[acfh] [字符范围] 表示某一范围的字符,如[0-9],[a-z] !或^ 用在字符集合或字符范围左方括号的后面,表示反向选择, 如[!3-9]表示除了3-9以外的字符
如果*和?出现在字符集合中,就失去了通配符的作用,只是星号和问号本身。在字符范围中,-表示范围,那么想在字符集合中表示-本身怎么办呢?您只需要把-放在字符集合的开始或最后就可以了。
通配符的使用方法如下:
[peter@ibi-genome alias]$ ll 总用量 8 drwxrwxr-x 2 peter peter 4096 4月 28 10:43 alias -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file_1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt -rw-rw-r-- 1 peter peter 24 4月 28 10:33 test.sh [peter@ibi-genome alias]$ ll file* -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file_1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt [peter@ibi-genome alias]$ ll file?.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt [peter@ibi-genome alias]$ ll file[1-3]* -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt [peter@ibi-genome alias]$ ll file[13]* -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt [peter@ibi-genome alias]$ ll file[^1]* -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file_1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt
Bash除了支持上面的通配符,还支持下面的模式表达式:
*(模式1|模式2...) 0次、1次或多次出现任意一模式 +(模式1|模式2...) 1次或多次出现任意一模式 ?(模式1|模式2...) 0次或1次出现任意一模式 @(模式1|模式2...) 1次出现任意一模式 !(模式1|模式2...) 除1次出现任意一模式外的任何字符串
模式表达式的使用方法如下:
[peter@ibi-genome alias]$ ll 总用量 4 -rw-rw-r-- 1 peter peter 0 4月 28 20:07 file -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file_1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.c -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.pl -rw-rw-r-- 1 peter peter 0 4月 28 20:08 file.pl.pl -rw-rw-r-- 1 peter peter 24 4月 28 10:33 file.sh -rw-rw-r-- 1 peter peter 0 4月 28 20:01 file.txt [peter@ibi-genome alias]$ ll file*(.pl|.sh) -rw-rw-r-- 1 peter peter 0 4月 28 20:07 file -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.pl -rw-rw-r-- 1 peter peter 0 4月 28 20:08 file.pl.pl -rw-rw-r-- 1 peter peter 24 4月 28 10:33 file.sh [peter@ibi-genome alias]$ ll file+(.pl|.sh) -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.pl -rw-rw-r-- 1 peter peter 0 4月 28 20:08 file.pl.pl -rw-rw-r-- 1 peter peter 24 4月 28 10:33 file.sh [peter@ibi-genome alias]$ ll file?(.pl|.sh) -rw-rw-r-- 1 peter peter 0 4月 28 20:07 file -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.pl -rw-rw-r-- 1 peter peter 24 4月 28 10:33 file.sh [peter@ibi-genome alias]$ ll file@(.pl|.sh) -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.pl -rw-rw-r-- 1 peter peter 24 4月 28 10:33 file.sh [peter@ibi-genome alias]$ ll file!(.pl|.sh) -rw-rw-r-- 1 peter peter 0 4月 28 20:07 file -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file_1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file1.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:38 file2.txt -rw-rw-r-- 1 peter peter 0 4月 28 19:39 file3.txt -rw-rw-r-- 1 peter peter 0 4月 28 20:02 file.c -rw-rw-r-- 1 peter peter 0 4月 28 20:08 file.pl.pl -rw-rw-r-- 1 peter peter 0 4月 28 20:01 file.txt
有了通配符和模式表达式,我们就可以一次操作多个文件,比如rm file*就删除当前目录下所有以file开头的文件(除非您知道自己在干什么,否则不要乱用rm *)。