35

我想从一个目录中删除几个文件,匹配一个正则表达式。像这样的东西:

// WARNING: not real code
require('fs').unlink(/script\.\d+\.js$/);

由于unlink不支持正则表达式,我使用它来代替:

var fs = require('fs');

fs.readdir('.', (error, files) => {
    if (error) throw error;

    files.filter(name => /script\.\d+\.js$/.test(name)).forEach(fs.unlink);
});

这可行,但 IMO 比它应该的要复杂一些。


有没有更好的内置方法来删除与正则表达式匹配的文件(甚至只使用通配符)?

4

4 回答 4

28

不,Node 库中没有通配符。如果你不想从 NPM 中提取一些东西,那么不用担心,它只需要一行代码。但是在我的测试中,其他答案中提供的代码大多不起作用。所以这是我的代码片段,经过测试,可以正常工作,纯原生 Node 和 JS。

let fs = require('fs')
const path = './somedirectory/'
let regex = /[.]txt$/
fs.readdirSync(path)
    .filter(f => regex.test(f))
    .map(f => fs.unlinkSync(path + f))
于 2019-02-19T00:47:56.643 回答
11

您可以查看 glob https://npmjs.org/package/glob

require("glob").glob("*.txt", function (er, files) { ... });
//or
files = require("glob").globSync("*.txt");

glob 在内部使用 minimatch。它通过将 glob 表达式转换为 JavaScript RegExp 对象来工作。https://github.com/isaacs/minimatch

您可以对回调中的匹配文件执行任何操作(或者在 globSync 返回的对象的情况下)。

于 2013-02-17T14:30:28.063 回答
1

我有一个非常简单的解决方案来做到这一点。使用 fs.readdir API 读取 node.js 中的目录。这将给出目录中所有文件的数组。拥有该数组后,使用 for 循环对其进行迭代,应用正则表达式。下面的代码将删除所有以“en”和扩展名“.js”开头的文件

fs.readdir('.', (err, files)=>{
   for (var i = 0, len = files.length; i < len; i++) {
      var match = files[i].match(/en.*.js/);
      if(match !== null)
          fs.unlink(match[0]);
   }
});
于 2017-01-10T14:54:33.187 回答
0

答案可能取决于您的环境。看起来您正在 node.js 上运行。快速阅读 node.js 文档表明没有“内置”方法可以执行此操作,即没有一个函数调用可以为您执行此操作。下一个最好的事情可能涉及少量的函数调用。正如我在评论中所写,我认为仅依靠标准的 node.js 函数调用,没有任何简单的方法可以使您的建议答案更简洁。也就是说,如果我站在你的立场上,我会采用你已经建议的解决方案(尽管稍微清理了一下)。

一种替代方法是转到外壳,例如,

var exec = require('child_process').exec;
exec('ls | grep "script[[:digit:]]\\\+.js" | xargs rm');

就个人而言,我更喜欢你提供的解决方案而不是这个 gobbledygook,但也许你正在寻找不同的东西。

于 2013-02-17T21:10:45.753 回答