Nodejs 有没有展开路径的模块?

Nodejs 有没有展开路径的模块?

由于不想重新发明轮子,但是又似乎找不到这方面的信息。

expand('/path/*/file.*')

会读取文件系统,把该路径的所有目录展开,根据表达式过滤得到符合要求的文件:

-> ['/path/a/file.jpg', '/path/b/file.html', ...]

又如:

expand('/path/123{0..2}/a{bc,ef}')
-> ['/path/1230/abc', /path/1230/aef', /path/1231/aef', ...]

有人知道有类似的库吗?


3 回复

当然可以!Node.js 社区提供了很多强大的库来处理路径展开和模式匹配。一个非常流行且功能强大的库是 glob。它不仅可以用于路径展开,还可以进行复杂的文件匹配。

使用 glob 模块进行路径展开

glob 模块允许你使用简单的通配符(例如 *, ?, {} 等)来匹配文件路径。以下是如何使用 glob 模块来实现你所描述的功能。

安装 glob 模块

首先,你需要安装 glob 模块。你可以通过 npm 来安装:

npm install glob

示例代码

下面是一个简单的示例,展示如何使用 glob 模块来展开路径并获取匹配的文件列表。

const glob = require('glob');

// 示例 1: 展开路径并匹配所有符合条件的文件
glob('/path/*/file.*', (err, files) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log(files);
});

// 示例 2: 使用更复杂的模式展开路径
glob('/path/123{0..2}/a{bc,ef}', (err, files) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log(files);
});

解释

  • glob('/path/*/file.*', callback):

    • * 匹配任意字符。
    • file.* 匹配文件名以 file. 开头的任何文件。
    • callback 是一个回调函数,当匹配完成时被调用,并返回一个数组,其中包含所有匹配的文件路径。
  • glob('/path/123{0..2}/a{bc,ef}', callback):

    • {0..2} 表示从 02 的数字范围。
    • {bc,ef} 表示 bcef
    • 这种组合会生成多个路径,例如 /path/1230/abc, /path/1230/aef, /path/1231/abc 等等。

通过这些示例,你可以看到 glob 模块的强大之处。它不仅简化了路径展开的过程,还提供了丰富的模式匹配能力。希望这对你有所帮助!


没有。自己写吧。

Node.js 中并没有内置的库来直接实现你描述的路径展开功能。不过你可以使用一些现有的第三方库来达到类似的效果。其中比较流行的是 globexpand 模块。

使用 glob 模块

glob 模块可以用来匹配文件路径模式。虽然它不像你描述的功能那么强大,但可以满足基本的路径展开需求。

安装 glob

npm install glob

示例代码

const glob = require('glob');

// 匹配所有以 .js 结尾的文件
glob('/path/**/*.js', (err, files) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log(files);
});

使用 expand 模块

expand 模块可以实现更复杂的路径展开,类似于你在问题中提到的例子。

安装 expand

npm install expand-tildify

示例代码

const expand = require('expand-tildify');

// 展开通配符和范围
const expandedPaths = expand.expand('/path/{1..3}/{a,b}{c,d}');
console.log(expandedPaths);

需要注意的是,expand-tildify 模块主要处理用户目录(如 ~)的展开,并不完全支持你提到的 {1..3} 这样的范围展开。你可以考虑结合其他库或者自己编写逻辑来实现完整的功能。

如果你需要更复杂的功能,可能需要结合多个模块或自定义逻辑来实现。希望这些示例能够帮助到你。

回到顶部