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