glob 语法一般是默认打开的,可以使用以下命令查询。如果是在 mac 下的 zsh 中,默认使用
^
而不是!
shopt extglob
#extglob on
# 如果没有打开,可以使用以下命令进行打开
shopt -s extglob
glob 语法最早应用于 linux shell 的一部分,现在在几乎所有的linux系统中都可以使用
.
(git bash 等也可以在 windows 使用)
- 基础语法:
/
、*
、?
、[]
- 拓展语法:
**
、{}
、()
# 生成a1.js,a2.js,b1.js,b2.js
touch {a,b}{1..2}.js
分隔符和片段
src/index.js
有两个片段,分别是src
和index.js
src/**/*.js
有三个片段,分别是src
、**
和*.js
单个
*
:单个信号*
用于匹配单个片段中的零个或者多个字符
./img/*.png
表示img
目录下所有以png
结尾的文件,但是不能匹配到img
子目录中的文件- 这时候可以使用
./img/*/*.png
:可以匹配所有 img 子目录下的png
结尾的文件(不包括 img 目录下的 png)
ls ./img/*/*.png
- 如果匹配的是所有的隐藏文件(以
.
开头的文件)ls *
并不会输出它们
echo .*
- 如果匹配的隐藏文件要忽略(
.
和..
)
echo .[!.]*
# mac 下
echo .[^.]*
?
:匹配单个片段中的单个字符
- 匹配单个文件名, 例如
a.md
或者b.md
...
ls ?.md
- 如果要匹配多个字符,例如
index.md
则需要使用?????.md
,匹配五个字符。 - 注意:
?
不能匹配空字符,它占据的位置必须有字符存在
[]
:同样时匹配单个片段中的单个字符,但是字符集只能从括号中选择,如果字符集内有-
,表示范围
-
该
[]
使用方式和正则一样ls test/[c-f]at.js #test/cat.js test/dat.js test/eat.js test/fat.js
-
[!..]
和[^..]
完全等价:匹配除了括号字符的所有文件ls test/[!c-d]at.js # test/eat.js test/fat.js
**
/*
:可以跨片段匹配零个或者多个。这两个在递归目录时并没有本质的区别。/**/
或者/*/
#匹配img下的所有文件和文件夹
ls ./img/*
{}
:匹配大括号内的所有模式,并支持使用..
匹配连休的字符{start,end}
-
即使只有一个模式也需要使用
,
隔开# a.png a.jpeg a.jpg touch a.{png,jp{,e}g}
-
使用
..
创建连续的文本# 创建 1 到 100 结尾的 touch bash{1..100}.js # 创建 1 到 100 中为奇数的 # start..end..step touch bash{1..100..2}.css # 创建 a-z 顺序的 touch bash{a..z}.html
-
其中还可以使用多个
..
进行循环echo {a..c}{1..3} a1 a2 a3 b1 b2 b3 c1 c2 c3 # 也可以添加一些其他的固定的字符 echo {a..c}--{1..3}
-
{}
和[]
的其中一个区别:如果匹配的文件不存在,[]
会失去模式的功能。变成一个单纯的字符串,但是{}
依然可以展开 -
()
:小括号必须跟在?
、*
、+
、@
、!
后面使用,且小括号里面的内容是一组以|
分隔符的模式集合 -
?(pattern|pattern|pattern)
:匹配0次或1次给定的模式 -
*(pattern|pattern|pattern)
:匹配0次或多次给定的模式 -
+(pattern|pattern|pattern)
:匹配1次或多次给定的模式 -
@(pattern|pattern|pattern)
:严格匹配给定的模式 -
!(pattern|pattern|pattern)
:匹配非给定的模式