Javascript globbing-匹配某些文件扩展名但不匹配其他文件扩展名的正确方法
我在Javascript globbing-匹配某些文件扩展名但不匹配其他文件扩展名的正确方法,javascript,node.js,gruntjs,glob,node-glob,Javascript,Node.js,Gruntjs,Glob,Node Glob,我在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:
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
变量中有三种不同的匹配:
yearCache
和weekCache
weekCache中携带的扩展名匹配
yearCache中携带的扩展名匹配
public
目录及其子目录中有63个文件。然而,这些规则匹配72个文件,很明显,一些文件至少匹配了两次
我的地球仪怎么了
编辑:
使用节点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)
?我认为您的问题在于文件名包含多个点()
您的模式指定查找具有一定数量的非点字符、后跟点字符、后跟除“css”或“js”以外的任何字符的所有文件名
以文件名“jquery.fancybox.js”为例。对于这个文件名,我们发现有一些非点字符“jquery”,后跟一个点“.”,后跟不是“css”和“js”、“fancybox.js”的字符。此文件名与模式匹配,因此返回
如果上面的文件名是“fancybox.js”,它将匹配一些非点字符“fancybox”,后跟一个点“.”,但后跟的字符不是“css”和“js”。因此,该文件名将无法与模式匹配,并且不会返回
我们要做的是在否定模式中指定在扩展名“.css”或“.js”之前可能有更多的非点字符。我们可以使用以下模式进行此操作:
'**/*.!(*(*.)js|*(*.)css)'
我相信您的问题是您的文件名包含多个点(.) 您的模式指定查找具有一定数量的非点字符、后跟点字符、后跟除“css”或“js”以外的任何字符的所有文件名 以文件名“jquery.fancybox.js”为例。对于这个文件名,我们发现有一些非点字符“jquery”,后跟一个点“.”,后跟不是“css”和“js”、“fancybox.js”的字符。此文件名与模式匹配,因此返回 如果上面的文件名是“fancybox.js”,它将匹配一些非点字符“fancybox”,后跟一个点“.”,但后跟的字符不是“css”和“js”。因此,该文件名将无法与模式匹配,并且不会返回 我们要做的是在否定模式中指定在扩展名“.css”或“.js”之前可能有更多的非点字符。我们可以使用以下模式进行此操作:
'**/*.!(*(*.)js|*(*.)css)'
很好的解释。谢谢。我想,你提议的globbing不能捕获没有点的文件,对吗?很好的解释。谢谢。我想,你提议的globbing不能捕获没有点的文件,对吗?