#如何在Node.js中批量更名文件
了解如何使用Node.js更改一组文件名
在本篇博客文章中,我将解释如何更改一组文件的名称。
相同的过程也适用于将文件移动到另一个文件夹,因为在更改名称时,实际上是更改文件的路径。
进行此任务的动机是:在Hugo中,我们可以将博客文章编写为文件,如下所示:
first-post.md
second-post.md
third-post.md
我们还可以将它们添加到包含 index.md
文件的文件夹中:
first-post/
> index.md
second-post/
> index.md
third-post/
> index.md
不同之处在于,使用文件夹可以更轻松地添加图片并将其与博客文章关联起来。
我本可以手动进行更改,但这个文件夹中有大约50个文件,我真的不想自己动手。
我希望能够自动进行更改。
让我们首先引入我们将使用的一个核心模块:fs
。由于它是一个核心模块,所以无需进行 npm install
。
const fs = require('fs')
然后,获取对当前文件夹的引用。假设我们要在想要执行此更改的同一文件夹中运行脚本。
__dirname
是指向当前工作文件夹的变量。
我获取了所有文件和文件夹的列表:
const files = fs.readdirSync(__dirname)
然后,我仅筛选出以 .md
结束的项:
for (const file of files) {
if (file.endsWith('.md')) {
console.log(file)
}
}
一旦我们有了代表文件名的 file
引用,我们就可以调用 fs.mkdirSync()
来创建文件夹:
fs.mkdirSync(
__dirname + '/' + file.replace('.md', ''),
{ recursive: true },
(err) => {
console.log(err)
}
)
在创建文件夹后,我们调用 fs.renameSync()
。
我使用阻塞版本的 mkdirSync()
和 renameSync()
而不是 mkdir()
和 rename()
的原因是,我希望在移动文件到文件夹之前等待文件夹的创建。否则,如果第二个函数在第二个函数之前运行,我们可能会遇到错误(应该使用 await
,但Node.js API 不使用 promises,我们必须使用promisify,但使用阻塞版本的API更简单)。
fs.renameSync()
函数接受3个参数:
- 当前路径
- 我们要移动到的路径
- 如果出现错误则触发回调
当前路径是:
__dirname + '/' + file
我们要移动到的路径是:
__dirname + '/' + file.replace('.md', '') + '/index.md'
看到了吗?我们根据文件名创建一个新文件夹,然后添加 index.md
:
fs.renameSync(
__dirname + '/' + file,
__dirname + '/' + file.replace('.md', '') + '/index.md',
err => {
console.log(err)
}
)
以下是完整的代码:
const fs = require('fs')
const files = fs.readdirSync(__dirname)
for (const file of files) {
if (file.endsWith('.md')) {
fs.mkdirSync(
__dirname + '/' + file.replace('.md', ''),
{ recursive: true },
(err) => {
console.log(err)
}
)
fs.renameSync(
__dirname + '/' + file,
__dirname + '/' + file.replace('.md', '') + '/index.md',
(err) => {
console.log(err)
}
)
}
}