使用通配符来操作文件
通配符是bash中常用的功能,它可以帮助我们灵活地操作文件。掌握通配符对于编写有效的bash脚本非常重要。在bash中,最常用的通配符有以下四种: *: 表示任意长度的任意字符。 ?:
通配符是bash中常用的功能,它可以帮助我们灵活地操作文件。掌握通配符对于编写有效的bash脚本非常重要。在bash中,最常用的通配符有以下四种:
*: 表示任意长度的任意字符。?: 表示任意的单个字符。[]: 表示在指定范围内的单个字符,例如[a-z]表示从小写字母a到z中的任意一个字符。[^]: 脱字符,表示取反,即在指定范围以外的任意字符,例如[^0-9]表示除了数字以外的任意字符。
下面举几个例子来演示如何使用通配符:
- 复制
/etc下所有以i开头的文件:cp -v /etc/i* /tmp
ls /tmp - 复制
/etc下所有以.conf结尾的文件:cp -v /etc/*.conf /tmp
ls /tmp - 复制
/etc下以i开头、以.conf结尾的文件:cp -v /etc/i*.conf /tmp
ls /tmp - 复制
/etc下以i开头、以.conf结尾、中间包含一个任意字符的文件:cp -v /etc/i?.conf /tmp
ls /tmp - 复制
/etc下以i开头、以.conf结尾、中间包含以a、b、c、d中任意一个字母开头的文件:cp -v /etc/i[abcd]*.conf /tmp
ls /tmp - 复制
/etc下以一个非数字字符和一个数字组合命名的文件:cp -v /etc/[^0-9][0-9] /tmp
ls /tmp - 复制
/etc下以p开头、中间跟了任意字符,并以d结尾的文件:cp -vr /etc/p*d /tmp
ls /tmp
如果文件在/etc的子目录中,可以采用递归的方式进行复制。
- 复制
/etc下以p开头、后跟了4个任意字符、以d结尾的文件至/tmp/a中,若a不存在,则先创建a目录:mkdir /tmp/a; cp -vr /etc/p????d /tmp/a
ls /tmp/a - 复制
/etc下以任意一个非数字开头、以数字结尾的文件至/tmp/b中:mkdir /tmp/b; cp -vr /etc/[^0-9]*[0-9] /tmp/b
ls /tmp/b - 复制
/etc下以非字母开头、后面跟了一个字母及任意长度的字符文件至/tmp/c中:mkdir /tmp/c; cp -vr /etc/[^a-zA-Z][a-zA-Z]* /tmp/c
ls /tmp/c
其他通配符
除了上述常用的通配符之外,还有一些在实际工作中经常用到的通配符,列举如下:
[[:digit:]]: 表示所有的数字,相当于0-9。[[:lower:]]: 表示所有的小写字母。[[:upper:]]: 表示所有的大写字母。[[:alpha:]]: 表示所有的字母。[[:alnum:]]: 相当于0-9a-z,表示数字和小写字母。[[:space:]]: 相当于空白字符。[[:punct:]]: 表示所有的标点符号。
注意,[a-z]和[A-Z]其实是不区分大小写的,例如:
ls /etc/[a-z]*.conf ls /etc/[[:lower:]]*.conf ls /etc/[A-Z]*.conf ls /etc/[[:upper:]]*.conf
[[:alpha:]]表示所有的字母,例如:
ls /etc/p[[:alpha:]]*.conf
[[:alnum:]]相当于0-9a-z,例如:
ls /etc/p[[:alnum:]]*.conf
[[:space:]]表示空白字符,例如:
touch /tmp/'a b' ls /tmp/[a-z][[:space:]][a-z][[:punct:]]
[[:punct:]]表示所有的标点符号,例如:
touch /tmp/'a!b' ls /tmp/[[:alnum:]][[:punct:]][[:alnum:]]