常用工具模块NodeJS文件系统遍历工具:fast-glob
1. 简介
fast-glob 提供了遍历文件系统的方法,并根据 Unix Bash shell 使用的规则返回与一组定义的指定模式匹配的路径名,并进行了一些简化,同时以任意顺序返回结果。它支持同步、Promise 和 Stream API。
2. glob 语法
2.1 什么是 glob
glob 是一种由普简便的用于匹配文件路径的方法,可以通过它在文件系统中方便的指定和筛选文件。
2.2 glob 语法规则详解
2.2.1 glob 通配符: *
和很多其它地方一样,glog 使用 *
作为通配符以匹配任意数量的任何字符。举个例子来说:
"src/*.js" // 匹配 src 目录下的所有后缀名为 js 的文件 "src/**" // 匹配 src 目录下的所有文件 "src/**/*.ts" // 匹配 src 目录下任意子目录下的后缀名为 ts 的文件
2.2.2 单个字符匹配 ?
?
用于匹配该限定符前的字符0或1次,与正则表达式中的?
类似,但是一般glob是表示该符号后面的那个字符。
2.2.3 列表匹配 [ABCD]
列表匹配同于匹配[]
中列出的所有字母,比如:
"[ABCD]" // A、B、C、D 的任意一个都会被匹配成功
2.2.4 列表排除 [!ABCD]
列表排除用于匹配除了[]
中列出的字符外的所有字符,与正则表达式的列表排除类似,只是正则表达式用的^
换成了!
。
例如:
"[!ABCD]" // A、B、C、D 之外的字符才能被匹配成功
2.2.5 区间匹配 [a-z]
、[A-Z]
、[0-9]
例如:
"[g-j]" // 匹配字符 g 、h、i、j "[C-F]" // 匹配字符 C、D、E、F "[3-7]" // 匹配字符 3、4、5、6、7
2.2.6 区间排除 [!a-z]
、[!A-Z]
、[!0-9]
区间排除用于匹配除了[]
中所表示的区间内所有字符以外的任意字符,与正则表达式的列表排除类似,只是正则表达式用的^
换成了!
。
例如:
"[5-7]" // 匹配除 5、6、7 以外的任意字符
3. fast-glob 的用法
3.1 使用同步 API
3.1.1 同步 API 的接口形式
fg.sync(patterns, [options])
3.1.2 例子
例如你有这样一个目录树:
dir/ └── one/ // 1 └── two/ // 2 └── file.js // 3
import fg from 'fast-glob' // 基本目录 fg.sync('dir/**', { onlyFiles: false, deep: 1 }); // ['dir/one'] fg.sync('dir/**', { onlyFiles: false, deep: 2 }); // ['dir/one', 'dir/one/two'] // 使用 cwd 选项 fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 1 }); // ['one'] fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 2 }); // ['one', 'one/two']
其中:
- deep 选项 表示指定读取目录相对于起始目录的最大深度;
- cwd 选项(默认为
process.cwd()
)表示要在其中搜索的当前工作目录。
3.2 使用 Promise API
3.2.1 Promise API 的接口形式
fg(patterns, [options])
3.2.2 例子
import glob from 'fast-glob' async function buildFullLocale(minify: boolean) { const files = await glob(`**/*.ts`, { cwd: path.resolve(PKG_LOCALE, 'lang'), absolute: true, }) return Promise.all( files.map(async (file) => { const filename = path.basename(file, '.ts') const name = upperFirst(camelCase(filename)) // Do something... }) ) }