Learn how to easily rename multiple files using Node.js.

In this blog post, I will guide you through the process of renaming a set of files using Node.js.

This process can also be used to move files to another folder, as renaming a file effectively changes its path.

The motivation behind this task was the need to manage blog posts in Hugo. Blog posts can be written as individual files, such as “first-post.md”, “second-post.md”, etc. Alternatively, they can be organized into folders with an “index.md” file, such as “first-post/index.md”, “second-post/index.md”, etc. Using folders allows easier management of associated images for each blog post.

To automate this task, I wanted to rename the files automatically instead of manually changing each one.

Let’s start by requiring the core module ‘fs’. Since it is a core module, there’s no need to install it via npm.

const fs = require('fs');

Next, obtain the reference to the current folder. We will assume that the script will be run in the same folder where the file renaming needs to be performed. The variable __dirname always holds the path to the current working folder.

const files = fs.readdirSync(__dirname);

Now, we can filter out only the items that have the “.md” extension.

for (const file of files) {
  if (file.endsWith('.md')) {
    console.log(file);
  }
}

Once we have the reference to each .md file, we can use fs.mkdirSync() to create a new folder.

fs.mkdirSync(
  __dirname + '/' + file.replace('.md', ''),
  { recursive: true },
  (err) => {
    console.log(err);
  }
);

After creating the folder, we can use fs.renameSync() to move the file into the newly created folder.

fs.renameSync(
  __dirname + '/' + file,
  __dirname + '/' + file.replace('.md', '') + '/index.md',
  (err) => {
    console.log(err);
  }
);

It’s important to note that I used the blocking versions of mkdirSync() and renameSync() instead of their non-blocking counterparts (mkdir() and rename()) because I wanted to ensure that the folder is created before moving the file. Using the blocking versions simplifies this process.

Here’s the complete code:

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

By following these steps, you can easily rename or move a set of files using Node.js. Now you have a quicker and more efficient way of managing your files.