node - glob模塊

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 數組

路徑中的某一段可使用下面的這些字符表示,他們各自都有很炫的做用:異步

  • 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

相關文章
相關標籤/搜索