Node-Glob 是 JavaScript 中的 glob 实现

发布于 2021-08-02 20:40:54 字数 5006 浏览 1627 评论 0

node 的 glob 模块允许你使用 * 等符号,来写一个 glob 规则,像在 shell 里一样,获取匹配对应规则的文件。这个 glob 工具基于 JavaScript。它使用了 minimatch 库来进行匹配。

使用方法


首先下载 glob 包:npm install glob

调用

var glob = require("glob")

// options 是可选的
glob("**/*.js", options, function (er, files) {
  // files 是匹配到的文件的数组.
  // 如果 `nonull` 选项被设置为true, 而且没有找到任何文件,那么files就是glob规则本身,而不是空数组
  // er是当寻找的过程中遇的错误
})

globs 就是模式,比如当你在命令行里输入 ls *.js,又或者是你在 .gitignore 文件里写的 bulid/* 这些。

在解析路径模型的时候, 大括号里用多个逗号隔开的内容会被展开, 里面的部分也可以包含 "/" ,比如 a{/b/c, bcd} 会被展开成 a/b/cabcd

路径中的某一段可以使用下面的这些字符表示,他们各自都有很炫的作用:

1、*

匹配该路径段中 0 个或多个任意字符:

//*:匹配路径中某部分:0个或多个字符
glob("js/*.js",function (er, files) {
  console.log(files)
})

获取js目录下的所有js文件.(不包括以.开头的文件)

2、?

匹配该路径段中 1 个任意字符:

//?:匹配路径中某部分:1个字符
glob("js/?.js",function (er, files) {
  console.log(files)
})

获取 js 目录下所有名字只有 1 个字的 js

3、[...]

匹配该路径段中在指定范围内字符:注意:不能组合,只能是其中一个字符

//[]:匹配路径中某部分:指定的范围
  glob("js/a[0-3].js",function (er, files) {
    console.log(files)
  })

获取js目录下a开头,第二个字符为0-3之间(包括03)的js(a03.js不能被匹配到)

4、*(pattern|pattern|pattern)

匹配括号中多个模型的0个或多个或任意个的组合,注意 | 前后不能有空格

//*(pattern|pattern|pattern): 匹配路径中的某部分: 多个模型中的0个或多个. //除了三个模型本身,如果是组合也可以,比如ab.js,但是仅仅包含某个模型是不行的,比如a4.js.
  glob("js/*(a|a1|b).js",function (er, files) {
    console.log(files)
  })

获取js目录下a.js,a1.js,b.js,或者a,a1,b这几个字符的组合的js,比如ab.js

5、!(pattern|pattern|pattern)

匹配不包含任何模型

需要注意: !(pattern|pattern|pattern) 不等于 !(*(pattern|pattern|pattern))

//!(pattern|pattern|pattern): 匹配路径中的某部分: 不包含任何模型. //带有a或者b的,都排除.需要注意的是,它并非是*(a|b)的取反
  glob("js/!(a|b).js",function (er, files) {
    console.log(files)
  })

获取js目录下名字中不包含a,也不包含b的所有文件.

6、?(pattern|pattern|pattern)

匹配多个模型中的 0个或任意 1 个。

它和 4 的区别是,不可以组合.必须完全匹配

//?(pattern|pattern|pattern): 匹配路径中的某部分: 多个模型中的0个或1个. //精确匹配模型,不可以组合.
  glob("js/?(a|a2|b).js",function (er, files) {
    console.log(files)
  })

获取js目录下a.js,a2.js,b.js

7、+(pattern|pattern|pattern)

匹配多个模型中的 1个或多个,它和 4 的区别是,必须有一个,为空不匹配

//+(pattern|pattern|pattern): 匹配路径中的某部分: 多个模型中的1个或多个. //可以是任意一个模型,也可以是他们的组合,比如ab.js
  glob("js/+(a|a1|b).js",function (er, files) {
    console.log(files)
  })

获取js目录下 a.js,a1.js,b.js,或者 aa1b 这几个字符的组合的 js,比如 ab.js

8、@(pattern|pat*|pat?erN)

匹配多个模型中的任意1个.

//@(pattern|pattern|pattern): 匹配路径中的某部分: 多个模型中的1个. //精确匹配模型,不可以组合.和?的区别就是不可以为空.必须要是其中的一个.
  glob("js/@(a|a1|b).js",function (er, files) {
    console.log(files)
  })

6 的区别是不匹配为空的情况。

9、**

1 一样,可以匹配任何内容,但 ** 不仅匹配路径中的某一段,而且可以匹配 'a/b/c' 这样带有 '/' 的内容,所以,它还可以匹配子文件夹下的文件。

//**: 不是一个单独的路径中的某部分,而是可以带有'/',所以所有当前文件夹和子文件夹下都进行匹配
  glob("**/@(a|a1|b).js",function (er, files) {
    console.log(files)
  })

获取当前目录所有文件夹及子文件夹下的 a.jsa1.jsb.js

还有一种方式是设置 matchBase 属性为true,同样可以起到在当前路径下搜索所有子文件夹的效果:

//matchBase: 设置为true以后,在当前目录下所有的文件夹和子文件夹里寻找匹配的文件
  glob("@(a|a1|b).js",{matchBase:true},function (er, files) {
    console.log(files)
  })

没有获取到任何匹配文件

glob 没有获取到任何匹配的文件是,并不会像 shell 里那样返回模型本身,files 参数返回的是一个空数组,如果需要让 files 返回的是模型本身,需要设置 nonull 属性为 true

//nonull: 设置为true以后,如果没有找到匹配的文件,不返回空字符串,而是返回原始glob语句
glob("@(c|d|e).js",{nonull:true},function (er, files) {
  console.log(files)
})

同步获取匹配文件列表

前面讲到的都是异步的方法,传入一个回调,当获取到匹配的文件的时候执行回调,如果需要同步的获取文件列表,可以这样做:

var files = glob.sync(pattern, [options])

项目地址:https://github.com/isaacs/node-glob

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

lorenzathorton8

文章 0 评论 0

Zero

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

mylayout

文章 0 评论 0

tkewei

文章 0 评论 0

17818769742

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文