可以递归并发遍历所有子文件夹(类似多线程, 也可以改为串行遍历(类似单线程概念
挺方便的, 分享给大家
运行的时候就先修改下面的 filePath 和 strDelete 就可以了
node file.js
/* eslint-disable no-unused-expressions */
/*
因为经常从百度下载的收费文件夹里面的 文件夹和文件名都被插入了版权字符串导致异常的丑, 于是做了个这个快速批量的一次性修正所有子目录下的文件和文件夹名字, 删除不必要的版权字符串
*/
const fs = require('fs').promises
const path = require('path')
// 要替换的文件夹根目录绝对路径
const filePath = path.resolve(String.raw`F:\@Lesson\XXXX课程大全`)
// 文件夹名和文件名里包含的要剔除的字符串
const strDelete = '(关注公众号XXXX,免费领取200G+教程)'
/**
* 删除绝对路径中结尾文件名里面任意位置的指定字符串
* @param {String} srcStr 输入字符串
* @param {String} str 要删除的字符串
* @returns
*/
const trimFromEnd = (srcStr, str) => {
if (!str.trim().length) {
throw Error('trimFromEnd(srcStr, str)的参数 str 不可以为空')
}
// 修正输入根文件夹的名字里面含有要替换的str导致异常的bug
if (srcStr.lastIndexOf(path.sep) > srcStr.indexOf(str)) return srcStr
const index = srcStr.lastIndexOf(str)
return srcStr.substr(0, index) + srcStr.substr(index + str.length)
}
/**
* 搜索并替换文件夹名和文件名里面包含的XX字符串, 含子目录
* @param {String}} filePath 绝对路径
*/
async function fileDisplay(filePath) {
const files = await fs.readdir(filePath)
if (files.length > 0) {
// 去掉await就是串行, 这里我用并行处理, 速度快
await files.map(async (filename, index, arr) => {
try {
const fileDir = path.join(filePath, filename)
const stats = await fs.stat(fileDir)
const oldName = fileDir
const newName = trimFromEnd(fileDir, strDelete)
if (stats.isFile()) {
console.log('原始=>', oldName)
console.log('改为=>', newName)
try {
await fs.access(oldName)
oldName !== newName && (await fs.rename(oldName, newName))
} catch (err) {
console.log('文件不存在或者权限不够', err)
}
} else if (stats.isDirectory()) {
// 先改名, 再递归, 避免回溯的时候找不到改名前的文件夹了
fileDir !== newName && (await fs.rename(fileDir, newName))
await fileDisplay(newName)
// Promise.resolve()
}
} catch (err) {
console.log('发生错误', err)
}
})
}
}
fileDisplay(filePath)