删除(取消链接)与正则表达式匹配的文件

时间:2013-02-17 03:43:23

标签: javascript node.js file-io filesystems

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

// 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 个答案:

答案 0 :(得分:10)

您可以查看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的情况下返回对象)。

答案 1 :(得分: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]);
   }
});

答案 2 :(得分:1)

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

let fs = require('fs')
const path = './somedirectory/'
let regex = /[.]txt$/
fs.readdirSync(dbpath)
    .filter(f => regex.test(f))
    .map(f => fs.unlinkSync(dbpath + f))

答案 3 :(得分:0)

答案可能取决于您的环境。看起来你正在node.js上运行。仔细阅读node.js文档表明没有“内置”方法来执行此操作,即没有一个函数调用可以为您执行此操作。下一个最好的事情可能涉及少量的函数调用。正如我在评论中写的那样,我认为没有任何简单的方法可以让你的建议答案更简单,只需依靠标准的node.js函数调用。也就是说,如果我在你的鞋子里,我会选择你已经建议的解决方案(虽然稍微清理过)。

另一种方法是转到shell,例如,

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

就个人而言,我非常希望你提供的解决方案超过这个gobbledygook,但也许你正在拍摄不同的东西。