【问题标题】:How do /** and /* differ in terms of directory navigation in Grunt?/** 和 /* 在 Grunt 中的目录导航方面有何不同?
【发布时间】:2014-12-19 22:11:00
【问题描述】:

这对你们来说很容易,但我找不到这个问题的明确/正式答案。

假设我们在目录A。那么,

“A/*”大概意思是:A里面的每个文件和文件夹。

“A/**”则可能意味着:A 中的每个文件和文件夹,以及直接位于 A 中的每个子项中的每个文件和文件夹。(基本上,/* 运算符的扩展,它遍历更深一层根文件夹?又名 "/** " = "/* /* ")

我的“直接在内部”术语可能是错误的。说“直接孩子”之类的可能更好,但你明白了。

那么,“A/**/*”是什么意思呢?是否等于“A/* /* /*”?

虽然这看起来很基本,但当我没有对运算符的正式定义时,它会很混乱。

我目前正在使用 Javascript 并尝试修改 Gruntfile。但我想这些运算符可能会在任何情况下出现。

【问题讨论】:

    标签: directory gruntjs wildcard-expansion


    【解决方案1】:

    这种行为不是 JavaScript 固有的,并且与任何运算符都相关:就 JavaScript 而言,它只是一个字符串。

    这种全局扩展的处理由特定的库/消费者决定。对于 gruntjs,它包含在 Grunt Globbing Patterns:

    单独指定所有源文件路径通常是不切实际的,因此 Grunt 通过内置的 node-glob 和 minimatch 库支持文件名扩展(也称为 globbing)..

    • * 匹配任意数量的字符,但不匹配 /

    • ** 匹配任意数量的字符,包括 /,只要它是路径部分中的唯一内容

    大多数人需要知道的是,foo/*.js 将匹配 foo/ 子目录中所有以 .js 结尾的文件,但 foo/**/*.js 将匹配 foo/ 子目录中所有以 .js 结尾的文件,all 的子目录。

    因此(但请参阅具体文档!),/**/ 通常表示“匹配任意深度的目录”,/*//* 表示“匹配单个目录或文件部分”。


    gruntjs 文档对标准"/**/*.x" 模式中** 的具体机制有点模糊,但参考node-glob 说:

    如果“globstar”(**)单独存在于路径部分,则它会匹配零个或多个目录和子目录以搜索匹配项。它不会抓取符号链接的目录。

    [..双星字符]以bsdglob和bash 4.3的方式支持,其中**only如果是路径部分的唯一,则具有特殊意义。也就是说,a/**/b 将匹配 a/x/y/b,但 a/**b 不会。

    利用这些知识,我们得到每个中间目录数量的A/**/fA/fA/*/fA/*/*/f 等的等效性(当用作路径组件时)。

    【讨论】:

    • 哦,我现在看得更清楚了,谢谢。但我不明白:为什么我需要 A/**/* 而不是 A/** ?在我看来,A/** 可以表示 A 及其子目录中的任何文件?
    • @batilc 更新了具体案例的答案。
    • 感谢您的帮助。我需要对此进行更具体的澄清,因为我认为我理解您提供的解释,但这与我手中的内容不一致。我是 grunt 的新手,所以我的假设可能有误:我有这一行:......files: [{ expand: true, cwd: 'src/', src: ['img/* *'], dest: 'www/' }]..... 所以我期望它会复制 img 下的任何文件。但是,如果它不匹配任何文件,那么它会做什么呢?只返回子文件夹并让文件搜索在这些子文件夹中咕哝?
    • 使用"img/**/*"递归复制每个文件。如果没有尾随 /*,globstar 不在“路径组件”中,因此不会根据需要扩展到子目录。
    • 实际上该行确实将“img”下的每个文件夹和文件复制到“www”。所以我的猜测是 grunt 只希望复制文件夹列表,而不是文件本身。
    【解决方案2】:

    如果您看到A/**/*,这意味着递归搜索文件夹A 下每个文件夹的树。有关更多信息,请查看基本的 linux 样式文件命令。

    【讨论】:

    • A/**/*.js 那么意味着A的每个子文件夹中的每个js文件,包括A文件夹本身?顺便说一句,仍然找不到合法的文档:/
    • 是的,**/*.js 将匹配目录下的任何.js 文件。 * 是用于文件操作的通配符匹配器。 ** 是一个特殊的通配符,表示 every directory starting here,因此它不会匹配文件名。
    猜你喜欢
    • 2021-12-13
    • 2021-09-25
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多