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
原諒我這麼多選項實在不想一個一個翻譯過來了.......................畢竟大多數也用不到,若是有特殊需求,再查看文檔吧............