Skip to content

Instantly share code, notes, and snippets.

@fixpunkt
Last active June 18, 2023 20:14
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fixpunkt/fe32afe14fbab99d9feb4e8da7268445 to your computer and use it in GitHub Desktop.
Save fixpunkt/fe32afe14fbab99d9feb4e8da7268445 to your computer and use it in GitHub Desktop.
nodejs: remove empty directories recursively, async version of https://gist.github.com/jakub-g/5903dc7e4028133704a4
const fsPromises = require('fs').promises;
const path = require('path');
/**
* Recursively removes empty directories from the given directory.
*
* If the directory itself is empty, it is also removed.
*
* Code taken from: https://gist.github.com/jakub-g/5903dc7e4028133704a4
*
* @param {string} directory Path to the directory to clean up
*/
async function removeEmptyDirectories(directory) {
// lstat does not follow symlinks (in contrast to stat)
const fileStats = await fsPromises.lstat(directory);
if (!fileStats.isDirectory()) {
return;
}
let fileNames = await fsPromises.readdir(directory);
if (fileNames.length > 0) {
const recursiveRemovalPromises = fileNames.map(
(fileName) => removeEmptyDirectories(path.join(directory, fileName)),
);
await Promise.all(recursiveRemovalPromises);
// re-evaluate fileNames; after deleting subdirectory
// we may have parent directory empty now
fileNames = await fsPromises.readdir(directory);
}
if (fileNames.length === 0) {
console.log('Removing: ', directory);
await fsPromises.rmdir(directory);
}
}
module.exports = {
removeEmptyDirectories,
};
@AronSchoffer
Copy link

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment