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/c 和 abcd

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

  • 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之间(包括0和3)的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,或者a,a1,b这几个字符的组合的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.js,a1.js,b.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])

Glob类:

通过实例化一个glob.Glob类,可以获得一个glob对象:

var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)

实例化的时候传入的参数和glob(pattern,options,cb)是一样的.

它能够得到一个返回值,这个返回值是一个EventEmitter.

如果在选项中设置 sync 属性为 true, 表示同步获取.不可以传入cb回调. 要获取匹配结果,可以通过 g.found 来获取:

var globInstance = new glob.Glob("@(a|a1|b).js",{nonull:true,matchBase:true,sync:true});
console.log(globInstance.found);

事件:

  • end :  end事件会在文件匹配结束,找出所有匹配结果的时候触发,它接受的参数就是找到的文件的数组
  • match :  match事件会在每次匹配到一个文件的时候触发,它接受的参数就是匹配到的文件
  • error :  error事件会在匹配遇到错误的时候触发.接受的参数就是错误信息
  • abort :  当实例调用了.abort()方法时,abort事件被触发

方法:

  • pause 暂停匹配搜索
  • resume 继续匹配搜索
  • abort 永远停止匹配搜索,不能继续
var globInstance = new glob.Glob("js/@(a|a1|b).js",{nonull:true});
globInstance.on('match',function(file){
console.log(file)
});
globInstance.on('end',function(files){
console.log(files)
});
globInstance.on('abort',function(){
console.log('abort')
});
globInstance.pause();
globInstance.resume();
globInstance.abort();

属性:

  • minimatch glob所使用的minimatch对象.
  • options 传递给函数的options选项.
  • aborted 调用过abort()函数后它的值就是true.
  • cache
  • statCache
  • symlinks
  • realpathCache

options选项:

options用于配置模型匹配时候的匹配方式. 所有可以被传入到minimatch里的参数也都可以被传入到glob,另外node-glob还自己添加了一些配置项.

所有的选项如果没有特殊说明,默认值都是false

所有的选项也都适用于Glob类.

  • cwd
  • root
  • dot
  • nomount
  • mark
  • nosort
  • stat
  • silent
  • strict
  • cache
  • statCache
  • symlinks
  • sync
  • nounique
  • nonull
  • debug
  • nobrace
  • noglobstar
  • noext
  • nocase
  • matchBase
  • nonull
  • nodir
  • ignore
  • follow
  • realpath
  • nonegate
  • nocomment

原谅我这么多选项实在不想一个一个翻译过来了.......................毕竟大多数也用不到,如果有特殊需求,再查看文档吧............

参考原文: https://github.com/isaacs/node-glob

node - glob模块的更多相关文章

  1. node中glob模块

    glob glob允许使用规则,从而获取对应规则匹配的文件 node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件 安装 npm install ...

  2. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

  3. 深入浅出node(2) 模块机制

    这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...

  4. glob模块

    Python模块(glob) 主要是用来在匹配文件,相当于在shell中用通配符匹配.  参考:  http://python.usyiyi.cn/python_278/library/glob.ht ...

  5. Node.js模块

    每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...

  6. devi into python 笔记(五)异常 文件操作 sys os glob模块简单实用

    异常: Java异常: try catch块处理异常,throw引发异常. Python异常: try except块处理异常,raise引发异常. 异常如果不主动处理,则会交给Python中的缺省处 ...

  7. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  8. 编写原生Node.js模块

    导语:当Javascript的性能需要优化,或者需要增强Javascript能力的时候,就需要依赖native模块来实现了. 应用场景 日常工作中,我们经常需要将原生的Node.js模块做为依赖并在项 ...

  9. 编写原生的Node.js模块

    导语:当Javascript的性能遭遇瓶颈,或者需要增强Javascript能力的时候,就需要依赖native模块来实现了. 应用场景 日常工作中,我们经常需要将原生的Node.js模块做为依赖并在项 ...

随机推荐

  1. 5种 JavaScript 调用函数的方法

    一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性 ...

  2. Android之自定义侧滑菜单

    先来上图: 我们把主界面从左向右拉动,可以看到地下有一层菜单页,从透明渐渐变得不透明,从小渐渐变大,感觉上觉得菜单页是从屏幕外面被拉到屏幕中的.下面的代码实现这个DEMO: 首先是自定义控件Slidi ...

  3. 取代 Windows Search

    windows自带的搜索工具太难用了,总是在你急需的时候提示还没有建立索引,眼皮底下的文件都找不到. 1. everything 适合快速搜索文件名 优点是速度快,非常快,几乎是瞬间就建立好了索引. ...

  4. 如何在ARM中创建Express Route

    很早之前就想试试Azure的express route,但是一直没有找到合适的机会,正好有个客户需要上express route,所以最近先自己研究研究,防止在做poc的时候耗费更多时间,本次场景我们 ...

  5. 虚拟机NAT网络配置

    今天虚拟机NAT模式配置网络遇到一个奇葩问题.主机能ping同虚拟机时,虚拟机不能ping同主机.相反虚拟机ping通主机时,主机ping不通虚拟机. 最后花了一个小时,终于可以互通了,做一个记录: ...

  6. Android压缩图片到100K以下并保持不失真的高效方法

    前言:目前一般手机的相机都能达到800万像素,像我的Galaxy Nexus才500万像素,拍摄的照片也有1.5M左右.这么大的照片上传到服务器,不仅浪费流量,同时还浪费时间. 在开发Android企 ...

  7. virtualenv基本操作(windows环境)

    1 下载virtualenv pip install virtualenv 2 创建一个virtualenv工作目录 mkdir myproject_env 3 穿件一个python项目 virtua ...

  8. NVelocity

    迭代内置对象:  velocityCount 集合数   :  count NVelocity遇到不能处理的引用时,一般会直接输出标签名称. 在$符号后加个!号,出现Null时,标签的内容就会显示空白 ...

  9. java并行计算Fork和Join的使用

    Java在JDK7之后加入了并行计算的框架Fork/Join,可以解决我们系统中大数据计算的性能问题.Fork/Join采用的是分治法,Fork是将一个大任务拆分成若干个子任务,子任务分别去计算,而J ...

  10. iOS CocoaPods 版本安装问题

    今天安装salesforce中的pods,这是里面的podfile # Uncomment this line to define a global platform for your project ...