#如何在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个参数:

  1. 当前路径
  2. 我们要移动到的路径
  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)
 }
 )
 }
}