Skip to content

Latest commit

 

History

History
129 lines (89 loc) · 3.59 KB

00.glob.md

File metadata and controls

129 lines (89 loc) · 3.59 KB

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 有两个片段,分别是 srcindex.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):匹配非给定的模式