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

通配符又叫做 globbing patterns。因为 Unix 早期有一个/etc/glob文件保存通配符模板,后来 Bash 内置了这个功能,但是这个名字被保留了下来。
通配符早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是胜在简单和方便。
本文介绍 Bash 的各种通配符。
一、? 字符
?字符代表单个字符。
# 存在文件 a.txt 和 b.txt $ ls ?.txt a.txt b.txt
上面命令中,?表示单个字符,所以会同时匹配a.txt和b.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 允许文件名使用通配符。这时,引用文件名的时候,需要把文件名放在单引号里面。
八、参考链接
(完)