在Node.js中使用glob并仅返回匹配项(无前导路径)

9

我需要匹配 ./../path/to/files/**/*.txt 这个路径,但是不想得到完整的匹配结果,而是只要文件名和它所在的子目录,比如:

./../path/to/files/subdir/file.txt

我只需要这样的结果:

subdir/file.txt

目前我的代码如下:

oldwd = process.cwd()
process.chdir(__dirname + "/../path/to/files")
glob.glob("**/*.txt", function (err, matches) {
  process.chdir(oldwd)
});

但这有点丑陋,而且似乎存在竞态条件:有时glob出现在oldwd上。因此,需要去掉它。

我正在考虑简单地映射matches并使用字符串操作剥离前导路径。由于glob返回已解决的点目录匹配,我想我也必须对我的搜索和替换字符串进行相同的处理。这变得越来越混乱,我想知道是否有更好的方法(内置或库?)来处理这个问题。

那么,在Node.js中进行全局匹配的好、整洁和正确的方法是什么,只需获取"匹配"部分?JavaScript和CoffeeScript都可以。

2个回答

24

将目录传递给选项,让glob处理所有混乱。

glob.glob("**/*.txt", {cwd: '../../wherever/'}, function(err, matches) {
    ...
});

这是最好的答案。 - Huston Hedinger
当我想要文件路径相对于节点应用程序的根目录时,我会在不使用cwd的情况下使用它。如果与wavy一起使用,它可以使从任何模块以相同方式(相对于您的应用程序的根目录)要求事物变得容易:例如 require('~/app/file.txt'); - DJDaveMark

6

试试这个:

var path = require('path');
var root = '/path/to/files';
glob.glob("**/*.txt", function(err, matches) {
    if(err) throw err;
    matches = matches.map(function(match) {
        return path.relative(root, match);
    });
    // use matches
});

哎呀,不幸的是我使用的是 Node 0.4.x,而 path.relative 似乎是后来添加的。 - Rebe
@Rebe: 你可以从path的源代码中剪掉 relative。(或者重命名整个模块并将其全部引入,这可能是一个更好的主意) - icktoofay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接