目录
一、理论
1.[ ]
[ ] 只能用于匹配文件名的场景。
2.{ }
{ } 无特定使用场景,但通常用于生成序列文件。在指令中使用{ }通配符,shell会先把{ }的内容按照解释方式翻译成一个或多个参数,再执行该含有多参数的指令。
二、区别
1.[ ]括号内字符解释
[ ] 内的字符只有两种解释方式:
(1)当[ ]内部是两个用短横线“-”连接的正序的单个字符(如[0-9],[a-z]),指令将匹配含有这两个字符之间(包括这两个字符)的所有字符的文件名。
① ls file[0-9]
上述指令将会使linux系统列出磁盘上所有符合格式的文件(即文件名为file0或file1或file2或file3……或file9的文件)。
(2)当[ ]内部结构不能同时满足上述三个条件(用短横线连接、正序、单个字符),指令将会把[ ]内的每一个字符都当作无关系的单个字符看待。
① ls file[1-10],将会匹配文件 file1 file- file0
② ls file[1..9], 将会匹配文件 file1 file. file9
③ ls file[1,4,5],将会匹配文件 file1 file, file4 file5
2.{}括号内字符解释
{ }内的字符有三种具有优先级的解释方式,按照优先级由高到低排列,分别如下:
(1)当{ }内部含有逗号","时,shell将会按照逗号把括号内的内容分割成几个字符串。
① touch file{1,2,3}
② touch file1 file2 file3
③ cp file{,.bak}
④ cp file file.bak
总结: 指令①与②等价,指令③与④等价。值得注意的是,当逗号分隔出的某个区间为空时(指令③),依旧按照正则表达式被解释为一个参数。指令③常常用于备份文件的创建。
(2)当{ }内部含有两个连续的小数点".."时,shell将会尝试将之解释为序列。
① 括号内部是由".."连接的两个数字时(不一定为单个字符,比如可以为7,18,29等等),shell会将之解释为这两个数字和其中间所有数字所组成的参数序列,比如,下列三条指令是等价的:
touch file{7..12}
touch file{12..7}
touch file7 file8 file9 file10 file11 file12
② 括号内部是由".."连接的两个字符时(必须为单个字符),shell会将之解释为在ASCII码表中这两个字符和其中间所有字符所组成的参数序列。值得注意的是,当其中一个字符为逗号","时,将按照优先级顺序,以(1)中的解释方式翻译。比如,下列第1)、2)和第3)、4)条指令分别是等价的:
1) touch file{,..?}
2) touch file file..?
3) touch file{,..5}
4) touch file file..5
③ 当括号内部虽然含有"..",却不满足上述两种格式,shell将不把它解释为序列,而是将{xx..xx}作为一个整体接受为指令的一个参数,即按照下边的第三种解释方式解释。
(3) 当括号内部不含有",",也不满足".."的两种序列格式,shell将不对其进行翻译,而是将大括号及其内容作为一个整体看待。
1) touch file{abc}
2) touch file{aa..zz}
3) touch file{}
三、实验
1.[ ]匹配文件名
(1)匹配file0到file9文件
2.{ }批量创建
(1)批量创建100个文件
(2)批量创建50个目录