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();
屬性:
-
glob所使用的minimatch對象.minimatch
-
傳遞給函數的options選項.options
-
調用過aborted
函數後它的值就是true.abort()
-
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