查找具有通配符匹配的文件
Posted
技术标签:
【中文标题】查找具有通配符匹配的文件【英文标题】:find file with wild card matching 【发布时间】:2014-02-14 16:12:58 【问题描述】:在node.js中,我可以列出带有通配符匹配的文件吗
fs.readdirSync('C:/tmp/*.csv')?
我没有从fs documention找到通配符匹配的信息。
【问题讨论】:
github.com/isaacs/node-glob 【参考方案1】:如果您不想在项目中添加新的依赖项(例如 glob
),您可以使用普通的 js/node 函数,例如:
var files = fs.readdirSync('C:/tmp').filter(fn => fn.endsWith('.csv'));
Regex
可能有助于进行更复杂的比较
【讨论】:
很好的解决方案!我检查过的 glob 库也使用readdirSync()
并解析结果。但在大多数情况下,单行解决方案比在项目中添加新的依赖项更快【参考方案2】:
这不被 Node 核心覆盖。您可以查看this module 了解您的需求。
设置
npm i glob
用法
var glob = require("glob")
// options is optional
glob("**/*.js", options, function (er, files)
// files is an array of filenames.
// If the `nonull` option is set, and nothing
// was found, then files is ["**/*.js"]
// er is an error object or null.
)
【讨论】:
这不是更好。更好的是让人们使用与该主题相关的资源。在这种情况下,学习使用 NPM/npmjs.org。 不一定是 Node 的东西,我觉得最好指出未来可以使用的资源,而不是仅仅向某人展示如何做某事。对于直接的 JS 问题,我对 MDN 做同样的事情。 @MorganARR:我只是在遵守政策。随意重新编辑。审查系统会发挥作用。顺便说一句:通过评论页面进行的编辑不会获得 +2。 如果您正在寻找同步解决方案,上面提到的 glob 库也有一个同步方法 github.com/isaacs/node-glob#globsyncpattern-options @MorganARRAllen 虽然我同意人们应该使用链接资源,但它也是 *** 标准的一部分,包括您在回答中描述的内容示例。我倾向于两者都做,就像这个答案在编辑后所做的那样,既有链接又有代码 sn-p。毕竟,链接可能会随着时间的推移而断开。【参考方案3】:如果 glob 不是你想要的,或者有点混乱,还有glob-fs。该文档通过示例涵盖了许多使用场景。
// sync
var files = glob.readdirSync('*.js', );
// async
glob.readdir('*.js', function(err, files)
console.log(files);
);
// stream
glob.readdirStream('*.js', )
.on('data', function(file)
console.log(file);
);
// promise
glob.readdirPromise('*.js')
.then(function(files)
console.log(file);
);
【讨论】:
【参考方案4】:以防万一您想通过正则表达式搜索文件(用于复杂匹配),然后考虑使用file-regex,它支持递归搜索和并发控制(以获得更快的结果)。
示例用法
import FindFiles from 'file-regex'
// This will find all the files with extension .js
// in the given directory
const result = await FindFiles(__dirname, /\.js$/);
console.log(result)
【讨论】:
【参考方案5】:开箱即用的match 非常简单
import fs from 'fs'
fs.readdirSync('C:/tmp/').filter((allFilesPaths:string) =>
allFilesPaths.match(/\.csv$/) !== null)
【讨论】:
【参考方案6】:不要重新发明***,如果您使用 *nix,ls
工具可以轻松做到这一点 (node api docs)
var options =
cwd: process.cwd(),
require('child_process')
.exec('ls -1 *.csv', options, function(err, stdout, stderr)
if(err) console.log(stderr); throw err ;
// remove any trailing newline, otherwise last element will be "":
stdout = stdout.replace(/\n$/, '');
var files = stdout.split('\n');
);
【讨论】:
如果是 Windows PC 怎么办? 我从未尝试过,但您可以使用 windowsdir /B
命令尝试类似的结果,您可能还需要在 \r\n
上拆分,不是肯定的
我强烈反对这种做事方式。从程序代码调用命令行工具并解析结果将导致维护灾难。我曾经继承过这样的项目。
我反对投反对票;当然,在某些用例中,glob
或其他一些模块会更可取(例如,如果您想跨多个平台部署并且不确定ls
的行为是否相同,)但我不认为我的回答草率或“明显或危险地不正确”。 "Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect."
这可能是一个实用的解决方案,但它根本不是解决方案。它与 Node.js 无关。以上是关于查找具有通配符匹配的文件的主要内容,如果未能解决你的问题,请参考以下文章