如何在Node.js中批量重命名文件

443 阅读2分钟

在这篇博文中,我将解释如何重命名一组文件。

同样的过程适用于将文件移动到另一个文件夹,因为当你重命名时,你会重命名文件的路径。

这个任务的动机是这样的:在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

然后,得到一个对当前文件夹的引用。我想我们要在我们要执行这个改变的同一文件夹中运行脚本。

__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不使用承诺,我们必须使用promise,但使用这些API的阻塞版本更简单)。

fs.renameSync() 函数接受3个参数。

  1. 当前路径
  2. 我们想要移动到的路径
  3. 发生错误时的回调。

当前路径是。

我们要移动到的路径是。

__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)
      }
    )
  }
}