命令行通配符教程

作者: 阮一峰

日期: 2018年9月20日

一次性操作多个文件时,命令行提供通配符(wildcards),用一种很短的文本模式(通常只有一个字符),简洁地代表一组路径。

通配符又叫做 globbing patterns。因为 Unix 早期有一个/etc/glob文件保存通配符模板,后来 Bash 内置了这个功能,但是这个名字被保留了下来。

通配符早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是胜在简单和方便。

本文介绍 Bash 的各种通配符。

一、? 字符

?字符代表单个字符。


# 存在文件 a.txt 和 b.txt
$ ls ?.txt
a.txt b.txt
        

上面命令中,?表示单个字符,所以会同时匹配a.txtb.txt

如果匹配多个字符,就需要多个?连用。


# 存在文件 a.txt、b.txt 和 ab.txt
$ ls ??.txt
ab.txt
        

注意,?不能匹配空字符。也就是说,它占据的位置必须有字符存在。

二、* 字符

*代表任意数量的字符。


# 存在文件 a.txt、b.txt 和 ab.txt
$ ls *.txt
a.txt b.txt ab.txt

# 输出所有文件
$ ls *
        

*可以匹配空字符。

三、[...] 模式

[...]匹配方括号之中的任意一个字符,比如[aeiou]可以匹配五个元音字母。


# 存在文件 a.txt 和 b.txt
$ ls [ab].txt
a.txt b.txt

$ ls *[ab].txt
ab.txt a.txt b.txt
        

[start-end]表示一个连续的范围。

四、[^...][!...]

[^...][!...]表示匹配不在方括号里面的字符(不包括空字符)。这两种写法是等价的。

五、{...} 模式

{...} 表示匹配大括号里面的所有模式,模式之间使用逗号分隔。


$ echo d{a,e,i,u,o}g
dag deg dig dug dog
        

六、{start..end} 模式

{start..end}会匹配连续范围的字符。


$ echo d{a..d}g
dag dbg dcg ddg

$ echo {11..15}
11 12 13 14 15
        

七、注意点

(1)通配符是先解释,再执行。

(2)通配符不匹配,会原样输出。

(3)只适用于单层路径。

上面所有通配符只匹配单层路径,不能跨目录匹配,即无法匹配子目录里面的文件。

(4)可用于文件名。

Bash 允许文件名使用通配符。这时,引用文件名的时候,需要把文件名放在单引号里面。

八、参考链接

(完)