倉庫:https://github.com/isaacs/node-glob
原文:https://www.cnblogs.com/liulangmao/p/4552339.html

這個(gè)模塊是干什么的
node的glob模塊允許你使用 *等符號(hào), 來寫一個(gè)glob規(guī)則,像在shell里一樣,獲取匹配對(duì)應(yīng)規(guī)則的文件。這個(gè)glob工具基于javascript.它使用了 minimatch 庫來進(jìn)行匹配
使用方法
- 首先下載
glob包:
npm install glob - 調(diào)用:
var glob = require("glob")
// options 是可選的
glob("**/*.js", options, function (er, files) {
// files 是匹配到的文件的數(shù)組.
// 如果 `nonull` 選項(xiàng)被設(shè)置為true, 而且沒有找到任何文件,那么files就是glob規(guī)則本身,而不是空數(shù)組
// er是當(dāng)尋找的過程中遇的錯(cuò)誤
})
globs 就是模式,比如當(dāng)你在命令行里輸入ls *.js, 又或者是你在 .gitignore 文件里寫的 bulid/* 這些.
在解析路徑模型的時(shí)候, 大括號(hào)里用多個(gè)逗號(hào)隔開的內(nèi)容會(huì)被展開, 里面的部分也可以包含"/" ,比如 a{/b/c, bcd} 會(huì)被展開成 a/b/c 和 abcd
路徑中的某一段可以使用下面的這些字符表示,他們各自都有很炫的作用:
-
*: 匹配該路徑段中0個(gè)或多個(gè)任意字符:
//*:匹配路徑中某部分:0個(gè)或多個(gè)字符
glob("js/*.js",function (er, files) {
console.log(files)
})
獲取js目錄下的所有js文件.(不包括以.開頭的文件)
-
?: 匹配該路徑段中1個(gè)任意字符:
//?:匹配路徑中某部分:1個(gè)字符
glob("js/?.js",function (er, files) {
console.log(files)
})
獲取js目錄下所有名字只有1個(gè)字的js.
-
[...]: 匹配該路徑段中在指定范圍內(nèi)字符:
注意:不能組合,只能是其中一個(gè)字符
//[]:匹配路徑中某部分:指定的范圍
glob("js/a[0-3].js",function (er, files) {
console.log(files)
})
獲取js目錄下a開頭,第二個(gè)字符為0-3之間(包括0和3)的js(a03.js不能被匹配到)
-
*(pattern|pattern|pattern): 匹配括號(hào)中多個(gè)模型的0個(gè)或多個(gè)或任意個(gè)的組合
注意|前后不能有空格
//*(pattern|pattern|pattern): 匹配路徑中的某部分: 多個(gè)模型中的0個(gè)或多個(gè). //除了三個(gè)模型本身,如果是組合也可以,比如ab.js,但是僅僅包含某個(gè)模型是不行的,比如a4.js.
glob("js/*(a|a1|b).js",function (er, files) {
console.log(files)
})
獲取js目錄下a.js,a1.js,b.js,或者a,a1,b這幾個(gè)字符的組合的js,比如ab.js
-
!(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的所有文件.
-
?(pattern|pattern|pattern): 匹配多個(gè)模型中的0個(gè)或任意1個(gè).
它和4的區(qū)別是,不可以組合.必須完全匹配
//?(pattern|pattern|pattern): 匹配路徑中的某部分: 多個(gè)模型中的0個(gè)或1個(gè). //精確匹配模型,不可以組合.
glob("js/?(a|a2|b).js",function (er, files) {
console.log(files)
})
獲取js目錄下a.js,a2.js,b.js
-
+(pattern|pattern|pattern): 匹配多個(gè)模型中的1個(gè)或多個(gè).
它和4的區(qū)別是,必須有一個(gè),為空不匹配
//+(pattern|pattern|pattern): 匹配路徑中的某部分: 多個(gè)模型中的1個(gè)或多個(gè). //可以是任意一個(gè)模型,也可以是他們的組合,比如ab.js
glob("js/+(a|a1|b).js",function (er, files) {
console.log(files)
})
獲取js目錄下a.js,a1.js,b.js,或者a,a1,b這幾個(gè)字符的組合的js,比如ab.js
-
@(pattern|pat*|pat?erN): 匹配多個(gè)模型中的任意1個(gè).
//@(pattern|pattern|pattern): 匹配路徑中的某部分: 多個(gè)模型中的1個(gè). //精確匹配模型,不可以組合.和?的區(qū)別就是不可以為空.必須要是其中的一個(gè).
glob("js/@(a|a1|b).js",function (er, files) {
console.log(files)
})
和 6 的區(qū)別是不匹配為空的情況
-
**: 和1一樣,可以匹配任何內(nèi)容,但**不僅匹配路徑中的某一段,而且可以匹配'a/b/c'這樣帶有'/'的內(nèi)容,所以,它還可以匹配子文件夾下的文件.
//**: 不是一個(gè)單獨(dú)的路徑中的某部分,而是可以帶有'/',所以所有當(dāng)前文件夾和子文件夾下都進(jìn)行匹配
glob("**/@(a|a1|b).js",function (er, files) {
console.log(files)
})
獲取當(dāng)前目錄所有文件夾及子文件夾下的a.js,a1.js,b.js
還有一種方式是設(shè)置 matchBase 屬性為true ,同樣可以起到在當(dāng)前路徑下搜索所有子文件夾的效果:
//matchBase: 設(shè)置為true以后,在當(dāng)前目錄下所有的文件夾和子文件夾里尋找匹配的文件
glob("@(a|a1|b).js",{matchBase:true},function (er, files) {
console.log(files)
})
沒有獲取到任何匹配文件:
當(dāng)glob沒有獲取到任何匹配的文件是,并不會(huì)像shell里那樣返回模型本身,files參數(shù)返回的是一個(gè)空數(shù)組,如果需要讓files返回的是模型本身,需要設(shè)置nonull屬性為true
//nonull: 設(shè)置為true以后,如果沒有找到匹配的文件,不返回空字符串,而是返回原始glob語句
glob("@(c|d|e).js",{nonull:true},function (er, files) {
console.log(files)
})
同步獲取匹配文件列表:
前面講到的都是異步的方法,傳入一個(gè)回調(diào),當(dāng)獲取到匹配的文件的時(shí)候執(zhí)行回調(diào).如果需要同步的獲取文件列表,可以這樣做:
var files = glob.sync(pattern, [options])