递归排除名称以特定字符开头的文件和文件夹使用nodejs和glob 解决方案尝试解决方案尝试

问题描述

Glob documentation(我会参考):

  • *在单个路径部分匹配0个或更多字符
  • ?匹配1个字符
  • [...]匹配一个字符范围,类似于RegExp范围。如果范围的第一个字符是-!或^,则匹配任何 字符不在范围内。
  • !(pattern | pattern | pattern)匹配与提供的任何模式都不匹配的任何内容
  • ?(pattern | pattern | pattern)匹配零个或一个出现的提供的图案。
  • +(pattern | pattern | pattern)匹配一次或多次出现的所提供模式。
  • *(a | b | c)匹配零次或多次出现的提供的模式
  • @(pattern | pat * | pat?erN)完全匹配提供的一种模式
  • **如果路径部分中仅包含“ globstar”,则它将匹配零个或多个搜索匹配项的目录和子目录。

递归排除名称以下划线开头的文件

解决方案尝试

  1. 首先,我们需要匹配零个或多个目录(我想,这意味着“在此目录中及以下”)。据我了解的文档,**应该这样做。
  2. 接下来,我们需要排除名称从下划线开始的文件。据信是[^_]*
  3. 左扩展名。也许.pug就足够了,但是.+(pug)允许将解决方案扩展到n文件扩展名,例如.+(pug|haml)
/Pages/Open/**/[^_]*.+(pug)

enter image description here

EntryPoint.pug被排除在外,但是它的名称并非以下划线开头。

? Fiddle

递归排除名称以下划线开头的目录

解决方案尝试

我所知道的是“ globstar匹配零个或多个目录和子目录以搜索匹配项”,而“ [^_]”不包括下划线。看起来仅仅建立正确的解决方案还不够。下面的解决方案很直观,不起作用。

/Pages/Open/[^_]**/*.+(pug)

enter image description here

? Fiddle

递归排除名称从下划线开始的文件和目录

仅通过结合文件和目录的解决方案,我们就能达到这种效果吗?

解决方法

使用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

fiddle

在花括号中,分别为每个级别(在逗号分隔的列表中)定义了排除下划线开头的目录的条件。


在您的示例中,需要涵盖4个级别(0是根)。 在第5层,只有文件(没有更多目录),因此文件名开始和.pug后缀的组合条件就足够了。
  • /[^_]*级/页
  • /[^_]*/[^_]*级/页面/打开
  • /[^_]*/[^_]*/[^_]*级/页面/打开/顶部
  • /[^_]*/[^_]*/[^_]*/[^_]*级别/ Pages / Open / Top / SubDirectory1

对于您可能拥有的每个其他级别,都会在条件中添加一个额外的细分。

  • /[^_]*/[^_]*/[^_]*/[^_]*/[^_]*潜在水平5

对于仅排除文件的情况,您尝试过的表达式效果很好,只是将其应用了1级。尝试:
/Pages/**/[^_]*.+(pug)

代替

/Pages/Open/**/[^_]*.+(pug)