2013-02-17 59 views
20

我想从一个目录中删除几个文件,匹配正则表达式。事情是这样的:删除(取消链接)匹配正则表达式的文件

// 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是有点复杂得多,它应该是。


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

+2

似乎合理。是什么让它看起来过于复杂? – loganfsmyth 2013-02-17 03:50:46

+2

@loganfsmyth - 因为我*希望*它更简单? :) – 2013-02-17 03:51:22

+4

为什么downvote? – 2013-02-17 03:58:28

回答

9

你可以看着水珠https://npmjs.org/package/glob

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

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

你可以用回调中匹配的文件做任何你想做的事情(或globSync返回的对象)。

+0

+1谢谢,但我正在寻找内置解决方案;我不认为这有理由将其他依赖项引入到我的项目中。如果没有更好的本地解决方案,我认为所发布的代码将为我提供很好的服务。 – 2013-02-17 18:28:37

+1

作为一个后续(虽然晚了几个月),想要使用Node.js中的“内置函数”来做事情并不是Node.js的方式。它与'npm'捆绑在一起,因为使用'npm install glob --save'(在这种情况下)添加一个新库非常容易。对于Node.js的开发,“通过npm”和“内置”几乎是一回事。 – 2013-09-13 22:59:20

0

答案可能取决于您的环境。它看起来像你在node.js上运行。仔细阅读一下node.js文档后发现,没有内置的方法可以做到这一点,也就是说,没有一个函数调用可以为你做到这一点。次好的事情可能涉及少量的函数调用。正如我在我的评论中所写的,我不认为只依靠标准的node.js函数调用就可以让你的建议答案简单得多。也就是说,如果我在你的鞋子里,我会选择你已经提出的解决方案(尽管稍微清理一下)。

一种选择是去外壳,例如,

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

就个人而言,我强烈希望在这个官样文章您提供的解决方案,但也许你拍摄不同的东西。

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]); 
    } 
}); 
+3

这与问题中的代码有什么不同? – 2017-01-10 18:43:39