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