DEV Community

Cover image for Read and rename files in a directory with Nodejs fs package
Majid Kareem
Majid Kareem

Posted on • Edited on

Read and rename files in a directory with Nodejs fs package

Hello, in this post, we will be bulk renaming all the files inside of a directory using the fs module rename method
This a continuation of a possibly long series of posts on the node.js fs and path module.
To get the best out of this post, it is recommended that you follow along from the previous post

Expectations

This post assumes a basic knowledge of JavaScript and Node.js


To get started, we will be continuing with the same folder structure from the previous post that was generated using a plain create-react-app template.

File structure

In our index.js, we need to import the fs and path module, next we define a path to our assets folder, I'll name it folderPath.



const fs = require("fs");
const path = require("path");


const folderPath = "./assets";



Enter fullscreen mode Exit fullscreen mode

Now that we have defined a path to our assets folder, let's get to the interesting part.
Next we read from the assets folder using the readdirSync method discussed in the previous post. This method returns a string array of the files in the directory



// read all files in the directory 
// and save filename to filesArr

let filesArr = fs.readdirSync(folderPath);



Enter fullscreen mode Exit fullscreen mode

Since the readdirSync method returns an array, I'm sure you must have guessed that we will need some kind of loop to access each element in the array. So let's do that, we will use a foreach to iteraate through the array, get each file and append the index of that file to it's filename.



// Loop through array and rename all files

filesArr.forEach((file, index) => { 

});


Enter fullscreen mode Exit fullscreen mode

Next, we will re-create the full path to each file inside the foreach loop, get the extension of the file and the file name without the extension using the join, extname, basename method from the path module.



...
  let fullPath = path.join(folderPath, file);
  let fileExtension = path.extname(file);
  let fileName = path.basename(file, fileExtension);
...



Enter fullscreen mode Exit fullscreen mode

Once we have the filename and extension seperated, we can go ahead and construct the new name for our file



let newFileName = fileName + index + "." + fileExtension;



Enter fullscreen mode Exit fullscreen mode

After that, we can rename our file using fs.renameSync. This method accepts the initial name of the file and the new file name as arguments



try {
  fs.renameSync(fullPath, path.join(folderPath, newFileName));
} catch (error) {
  console.error(error)
}


Enter fullscreen mode Exit fullscreen mode

Here is the complete version of the code we've written so far:



const fs = require("fs");
const path = require("path");

const folderPath = "./assets";


// read all files in the directory
let filesArr = fs.readdirSync(folderPath);


// Loop through array and rename all files 

filesArr.forEach((file, index) => {
  let fullPath = path.join(folderPath, file);
  let fileExtension = path.extname(file);
  let fileName = path.basename(file, fileExtension);

  let newFileName = fileName + index + "." + fileExtension;
try {
  fs.renameSync(fullPath, path.join(folderPath, newFileName));
} catch (error) {
  console.error(error)
}
});



Enter fullscreen mode Exit fullscreen mode

That's it. Now you have can rename a bunch of files in your directory all at once and tweak the above code anyhow you like.

Note

In the above example, it is assumed that we only have files in our assets directory and no sub-directories.

To learn more about fs and path modules, visit the official node.js documentation.
In my next posts, I'll be giving more examples of the fs module methods such as the fs.stats and talk about streams using the fs.createReadStream to read the contents of a file.

If you have suggestions or corrections, don't hesitate to get in touch

Top comments (0)