查找具有通配符匹配的文件

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 怎么办? 我从未尝试过,但您可以使用 windows dir /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 无关。

以上是关于查找具有通配符匹配的文件的主要内容,如果未能解决你的问题,请参考以下文章

通配符(一般用来查找文件)

通配符(一般用来查找文件)

linux文件名匹配——通配符使用

linux文件名匹配——通配符使用

linux文件名匹配——通配符使用

如何在objective-c中查找具有通配符表达式的多个文件