node的glob模块容许你使用 *等符号, 来写一个glob规则,像在shell里同样,获取匹配对应规则的文件.javascript
这个glob工具基于javascript.它使用了 minimatch 库来进行匹配java
用法:node
首先下载glob包: git
npm install globgithub
调用格式:shell
var glob = require("glob") // options 是可选的 glob("**/*.js", options, function (er, files) { // files 是匹配到的文件的数组. // 若是 `nonull` 选项被设置为true, 并且没有找到任何文件,那么files就是glob规则自己,而不是空数组 // er是当寻找的过程当中遇的错误 })
"globs" 就是模型,好比当你在命令行里输入 ls *.js, 又或者是你在 .gitignore 文件里写的 bulid/* 这些.npm
在解析路径模型的时候, 大括号里用多个逗号隔开的内容会被展开, 里面的部分也能够包含"/" ,好比 a{/b/c, bcd} 会被展开成 a/b/c 和 abcd 数组
路径中的某一段可使用下面的这些字符表示,他们各自都有很炫的做用:异步
//*:匹配路径中某部分:0个或多个字符 glob("js/*.js",function (er, files) { console.log(files) })
获取js目录下的全部js文件.(不包括以'.'开头的文件)
函数
//?:匹配路径中某部分:1个字符 glob("js/?.js",function (er, files) { console.log(files) })
获取js目录下全部名字只有1个字的js.
//[]:匹配路径中某部分:指定的范围 glob("js/a[0-3].js",function (er, files) { console.log(files) })
获取js目录下a开头,第二个字符为0-3之间(包括0和3)的js(a03.js不能被匹配到)
//*(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
//!(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
//+(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
//@(pattern|pattern|pattern): 匹配路径中的某部分: 多个模型中的1个. //精确匹配模型,不能够组合.和?的区别就是不能够为空.必需要是其中的一个. glob("js/@(a|a1|b).js",function (er, files) { console.log(files) })
和 6 的区别是不匹配为空的状况
//**: 不是一个单独的路径中的某部分,而是能够带有'/',因此全部当前文件夹和子文件夹下都进行匹配 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);
事件:
方法:
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
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
原谅我这么多选项实在不想一个一个翻译过来了.......................毕竟大多数也用不到,若是有特殊需求,再查看文档吧............