文件名通配

Shell Liemer_Lius 956℃ 0评论

介绍:

文件名通配,是bash的重要特性。在命令行中,我们经常用到这些通配,来实现快速定位、过滤,实现想要达到的目的。

文件名通配: globbing
*: 匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]: 大写字母
[:alpha:]: 大小写字母
[:digit:]: 数字
[:alnum:]: 数字和大小写字母
注意, 如上的部分表示的是一个范围, 而如果和[]联合使用, 以匹配单个字符的话, 需要在外面再包一层[]:
[[:space:]] ... ...

如果获取详细关于这些符号的介绍,可以用man来获取:# man 7 glob //获取标点符号的帮助, 可以获得这些列表.

[^]: []内部的^符号, 表示取反的意思. 匹配指定范围之外的任意单个字符

正则表达式中也有^, 通常在[]外面, 表示以[]的字符开头.

Example:
# touch a bd 12dkj dj54 sd9 dk21 aa 232 ddj
# ls
12dkj 232 a aa bd ddj dj54 dk21 sd9

# ls [a-zA-Z]*[0-9] //
dj54 dk21 sd9

# ls [^0-9]* //匹配非数字开头的项.
a aa bd ddj dj54 dk21 sd9

# touch 'a b' //空格也是可以作为文件名的.
# ls a\ b
a b

# ls *[[:space:]]* //用空白字符的标准写法来匹配
a b
# ls *\ * // 和用反斜线的效果相同
a b

shell中实现如下过滤:匹配以大小写字母开头, 中间夹着一个空格, 以非大小写字母结尾的任意字段.

[[:alpha:]]*[[:space:]]*[^[:alpha:]]

练习:

1、创建a123, cd6, c78m, c1 my, m.z, k 67, 8yu, 789等文件;注意,以上文件是以逗号隔开的,其它符号都是文件名的组成部分;
# touch a123 cd6 c78m c1 my m.z k\ 67 8yu 789 //注意, 空格可以作为文件名的组成部分, 但是在命令行中要用\来脱义才能执行成功, 否则空格被认为是分割符.

2、显示所有以a或m开头的文件;
ls [am]*

3、显示所有文件名中包含了数字的文件;
ls *[0-9]*
ls *[[:digit:]]*

4、显示所有以数字结尾且文件名中不包含空白的文件;
ls *[^[:space:]]*[0-9] ????????? 这个结果到底能不能完全表示如上的结果? 正则表达式能够完全表达上面的要求.

5、显示文件名中包含了非字母或数字的特殊符号的文件;
ls *[^[:alnum:]]*

转载请注明:liutianfeng.com » 文件名通配

喜欢 (0)

发表回复