【问题标题】:globbing - Correct way to match some files extensions but not othersglobbing - 匹配某些文件扩展名但不匹配其他文件扩展名的正确方法
【发布时间】:2016-07-28 22:00:48
【问题描述】:

我在下面写了 sn-p 作为grunt-aws-s3 任务的一部分。

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: ['**/*.@('+weekCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=604800, public'}}, // enable stream to allow large files
    {expand: true, cwd: 'public', src: ['**/*.@('+yearCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=31536000, public'}},
];

这个想法是在prodFiles 变量中拥有三个不同的匹配项:

  1. 匹配除yearCacheweekCache 匹配的文件之外的所有文件
  2. 匹配weekCache中带有扩展名的所有文件
  3. 匹配yearCache中带有扩展名的所有文件

它或多或少可以工作,我在public 目录及其子目录中有 63 个文件。但是这些规则匹配 72 个文件,很明显有些文件至少匹配了两次。

我的 globbing 有什么问题?

编辑:

使用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 '**/*.@(css|js)'
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
assets/js/jquery.fancybox.js
assets/js/jquery.fancybox-thumbs.js

那么,问题是如何正确否定模式'**/*.!(css|js)'

【问题讨论】:

    标签: javascript node.js gruntjs glob node-glob


    【解决方案1】:

    我相信您的问题是您的文件名包含多个点 (.)。

    您的模式指定查找具有一定数量的非点字符后跟一个点字符后跟“css”或“js”以外的任何字符的所有文件名。

    我们以文件名“jquery.fancybox.js”为例。有了这个文件名,我们发现有一些非点字符,“jquery”,后面跟着一个点,“.”,后面跟着不是“css”的字符不是“js”,“花式盒子.js”。此文件名与模式匹配,因此被返回。

    如果上面的文件名是“fancybox.js”,它会匹配一些非点字符,“fancybox”,后跟一个点,“.”,但 不是 后跟字符不是“css”而不是“js”。因此,此文件名将无法匹配模式并且不会被返回。

    我们想要做的是在我们的否定模式中指定在我们的“.css”或“.js”扩展名之前可能有更多的非点字符。我们可以通过以下模式做到这一点:

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

    【讨论】:

    • 很好的解释。谢谢。
    • 我认为,您提出的 globbing 不会捕获没有点的文件,对吗?
    猜你喜欢
    • 2012-06-04
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多