本小节将介绍一些Linux一个非常实用且出现频率较高的功能,linux通配符,并简述通配符和正则的区别,作为我的优快云专栏《系统学习Linux命令》的一篇。
前面的章节提到,如果想要一次性删除很多的文件,这个时候就需要使用到linux中的通配符机制。一些常见的场景如下:
- 输出当前目录中以特定字符开头的文件名。
- 将特定字符开头的文件合并成为一个新的文件。
- 将特定字符开头的文件移动到到另外一个目录。
- 一次性删除当前目录下所以.txt结尾的文件。
- 将特定字符开头的文件权限设置为777。
解决上述四个场景可以采用如图1所示的命令:
图1
图1中使用了*
这个通配符,同时可以看到很多的命令支持通配符的形式。除了上述提到的星号通配符,linux还提供了一些其他的字符,来表示更多的通配模式,具体如下:
*
表示任意多个字符,包含0次,如图1中在使用chmod设置权限的时候,test*中的test文件的权限也发生了改变。- ?表示任意一个字符,用以和*所表示的0次或者多次相对应。
- [[:type:]]该种形式表示匹配type类型中的字符,其中type具体可以是digit,表示匹配的是数字,upper表示匹配的是大写字母,lower表示匹配的是小写字母,alpha表示匹配任意一个字母。
- [characters]characters表示字符的集合,用中括号表示匹配其中任意一个字符
- !用来表示字符集合之外的字符,例如[![ABC]]表示除ABC之外的字符。
图2中分别使用了通配符*,[:digit:],[:upper:]等,如下:
图2
类似的,像rm,mv,chmod,cat等命令有一个共同的特点就是使用文件名作为参数,因此可以看到通配符的目的是匹配到更多的文件,可以和使用文件名为参数的命令配合使用。上述的表示次数的通配符*,表示否定的通配符!以及表示特定字符集的通配符配合使用能够解决很多的批量文件操作问题,在平时的使用过程中多加利用,能够提升效率。
但是通配符的目的还是依据模式选择已经存在的文件名。但是对于mkdir这种命令而言,他的参数不是已经存在的文件名称,通常是还没有存在的文件名称。这种情况下我们能不能借助通配符的思想,批量的创建文件呢。在linux中当然是可以的,但是这在linux中是另外一个话题,被称之为linux扩展,在后续的章节会继续讨论。
通配符和正则的区别
通配符其实是shell程序提供的一项功能,前面提到shell不仅仅是内核和终端之间的传话筒那么简单,这就是证据之一。当使用者在shell中输入*或者[[:digit:]]等通配符的时候,shell程序会在程序执行之前将其进行扩展,从这个角度来说通配符也是linux的扩展功能。由于通配符往往匹配的是文件名,因此通配符也被称之为Linux的路径扩展。由于通配符是shell提供的功能,因此通配符通常只能由shell进行解析,即只能在shell命令以及shell脚本中被使用。同时,凡是支持文件名入参的命令往往都是可以使用通配符的。
正则表达式大家往往听得比较多,不仅在Linux中,比如grep,awk等命令支持正则表达式,在python,Perl,Java等主流的语言中也是可以使用正则进行字符串的匹配的。因此通常意义上我们说正则表达式指的是一种字符串的匹配模式,当然这种模式有一个约定俗成的标准,比如*,?,$这些字符都被赋予了特殊的含义,当然其实在通配符中的[:digit:]以及[:upper:]在正则中也具有同样的表示含义,只是正则表达式这种模式更为的丰富和复杂。正是有了字符串匹配模式这样一个标准,实现了这种匹配模式的代码,被称之为正则引擎,很多的语言以及工具比如python和grep命令都会实现这样一个正则引擎。比较出名的就是perl语言中的正则引擎,很多其他语言以及工具或多或少受其影响。需要注意的是,在使用一些命令的时候,有的正则模式并不支持,这个时候就要注意该命令是否只是实现了基本的正则模式,对于一些扩展的模式并没有实现。关于正则表达式更多的内容,后续再讨论。
本文为优快云村中少年原创文章,未经允许不得转载,博主链接这里。