2016-07-28 79 views
0

我寫下面的片段作爲grunt-aws-s3任務的一部分。globbing - 正確匹配某些文件擴展名但不匹配的方法

var weekCache = 'css|js'; 
var yearCache = 'jpg|jpeg|png|gif|ico|eot|otf|ttf|woff|woff2'; 
var prodFiles = [ 
    {expand: true, cwd: 'public', src: ['**/*.!('+weekCache+'|'+yearCache+')'], dest: '/'}, 
    {expand: true, cwd: 'public', src: ['**/*[email protected]('+weekCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=604800, public'}}, // enable stream to allow large files 
    {expand: true, cwd: 'public', src: ['**/*[email protected]('+yearCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=31536000, public'}}, 
]; 

的想法是有三個不同的比賽裏prodFiles變量:

  1. 匹配所有除非yearCacheweekCache
  2. 匹配的全部文件weekCache
  3. 進行擴展匹配的那些文件匹配所有帶有擴展名的文件yearCache

它或多或少地工作,我有public目錄及其子目錄中的63個文件。但是,這些規則匹配72個文件,顯然有些文件至少匹配兩次。

我的通配符有什麼問題?

編輯:

測試與顯示錯誤node-glob-all在第一圖案:

$ glob-all '**/*.!(css|js)' 
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css 
assets/images/favicon.ico 
assets/js/jquery.fancybox.js 
assets/js/jquery.fancybox-thumbs.js 

我期待這種模式返回的一切,但排除*.js*.css。針對其他兩個規則進行測試返回正確的文件。

$ glob-all '**/*[email protected](css|js)' 
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css 
assets/js/jquery.fancybox.js 
assets/js/jquery.fancybox-thumbs.js 

所以,問題是如何正確地否定模式'**/*.!(css|js)'

回答

2

我相信你的問題是你的文件名包含多個點(。)。

您的模式指定查找所有包含一些非點號字符的文件名,後面跟一個點號字符,後跟除「css」或「js」以外的任何字符。

讓我們來看一個例如文件名「jquery.fancybox.js」。使用這個文件名,我們發現有一些非點字符「jquery」,後面跟着一個點「。」,後面跟着不是「css」的字符而不是「js」,「fancybox.js」。該文件名稱與模式匹配,因此返回。

有了上面的文件名是「fancybox.js」,它會通過一個點都匹配的一些非點的字符,「的fancybox」,隨後,」。‘而不是後面的字符不在’ css「而不是」js「。因此這個文件名將會失敗模式匹配並且不會被返回。

我們想要做的是在我們的否定模式中指定在我們的「.css」或「.js」擴展名之前可能會有更多的非點字符。我們可以用以下模式做到這一點:

'**/*.!(*(*.)js|*(*.)css)' 
+0

優秀的解釋。謝謝。 – JrBenito

+0

我認爲,你提出的globbing沒有捕獲沒有點的文件,我說得對嗎? – JrBenito

+1

這是正確的。 – 76484

相關問題