如何解决递归排除名称以特定字符开头的文件和文件夹使用nodejs和glob 解决方案尝试解决方案尝试
Glob documentation(我会参考):
- *在单个路径部分匹配0个或更多字符
- ?匹配1个字符
- [...]匹配一个字符范围,类似于RegExp范围。如果范围的第一个字符是-!或^,则匹配任何 字符不在范围内。
- !(pattern | pattern | pattern)匹配与提供的任何模式都不匹配的任何内容。
- ?(pattern | pattern | pattern)匹配零个或一个出现的提供的图案。
- +(pattern | pattern | pattern)匹配一次或多次出现的所提供模式。
- *(a | b | c)匹配零次或多次出现的提供的模式
- @(pattern | pat * | pat?erN)完全匹配提供的一种模式
- **如果路径部分中仅包含“ globstar”,则它将匹配零个或多个搜索匹配项的目录和子目录。
递归排除名称以下划线开头的文件
解决方案尝试
- 首先,我们需要匹配零个或多个目录(我想,这意味着“在此目录中及以下”)。据我了解的文档,
**
应该这样做。 - 接下来,我们需要排除名称从下划线开始的文件。据信是
[^_]*
。 - 左扩展名。也许
.pug
就足够了,但是.+(pug)
允许将解决方案扩展到n
文件扩展名,例如.+(pug|haml)
。
/Pages/Open/**/[^_]*.+(pug)
EntryPoint.pug
被排除在外,但是它的名称并非以下划线开头。
递归排除名称以下划线开头的目录
解决方案尝试
我所知道的是“ globstar匹配零个或多个目录和子目录以搜索匹配项”,而“ [^_]
”不包括下划线。看起来仅仅建立正确的解决方案还不够。下面的解决方案很直观,不起作用。
/Pages/Open/[^_]**/*.+(pug)
递归排除名称从下划线开始的文件和目录
解决方法
使用glob的ignore选项排除字符下划线开头的目录和文件
var glob = require('glob');
glob("**/*",{"ignore":['**/_**.pug',"**/_**/**"]},function (err,files) {
console.log(files);
})
// Output
[
'Pages','Pages/Open','Pages/Open/EntryPoint.pug','Pages/Open/Top','Pages/Open/Top/EntryPoint.pug','Pages/Open/Top/SubDirectory1','Pages/Open/Top/SubDirectory1/NonPartial.pug','test.js'
]
,
如何?
/**/[^_]*/[^_]*.pug
- 从根开始
- 所有目录,除了带有“ _”的星号
- 除以“ _”开头的文件外的所有文件
- “。pug”类型的所有文件
虽然还不足以使其递归,但是作为快速解决方案,您可以继续复制它,直到表达式中包含子文件夹的所有子文件夹为止。 我希望这能将您推向正确的方向...
还不确定是否要排除匹配的父文件夹的不匹配子文件夹,如果有意义的话。
,要在您的示例中同时排除文件和目录,则将在相应路径与指定条件匹配时执行以下操作。
{/[^_]*,/[^_]*/[^_]*,/[^_]*/[^_]*/[^_]*,/[^_]*/[^_]*/[^_]*/[^_]*}/[^_]*.pug
在花括号中,分别为每个级别(在逗号分隔的列表中)定义了排除下划线开头的目录的条件。
在您的示例中,需要涵盖4个级别(0是根)。 在第5层,只有文件(没有更多目录),因此文件名开始和.pug后缀的组合条件就足够了。
-
/[^_]*
级/页 -
/[^_]*/[^_]*
级/页面/打开 -
/[^_]*/[^_]*/[^_]*
级/页面/打开/顶部 -
/[^_]*/[^_]*/[^_]*/[^_]*
级别/ Pages / Open / Top / SubDirectory1
对于您可能拥有的每个其他级别,都会在条件中添加一个额外的细分。
-
/[^_]*/[^_]*/[^_]*/[^_]*/[^_]*
潜在水平5
对于仅排除文件的情况,您尝试过的表达式效果很好,只是将其应用了1级。尝试:
/Pages/**/[^_]*.+(pug)
代替
/Pages/Open/**/[^_]*.+(pug)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。