如何用NodeJS按文件创建日期(YYYY-MM)将文件归类到对应文件夹
NodeJS实现按文件创建日期YYYY-MM格式归类文件
问题
- 如何获取文件创建日期并据此将文件移动到YYYY-MM格式的文件夹?
- 如何按文件创建日期的YYYY-MM对文件进行分组?
文件示例
- file1 --> 创建日期=2023-01-01
- file2 --> 创建日期=2023-01-05
- file3 --> 创建日期=2023-01-20
- file4 --> 创建日期=2023-05-06
- file5 --> 创建日期=2023-06-04
- file6 --> 创建日期=2023-06-05
- file7 --> 创建日期=2023-05-25
预期结果
- 文件夹:2023-01 -- file1, file2, file3
- 文件夹:2023-05 -- file4, file7
- 文件夹:2023-06 -- file5, file6
解决方案
1. 获取文件创建日期并移动文件
核心步骤:
- 使用
fs.statSync()获取文件元信息,其中birthtime属性对应文件创建时间(跨平台兼容,Windows/macOS/Linux均支持) - 将创建时间格式化为
YYYY-MM字符串 - 自动创建目标文件夹(如果不存在),使用
fs.mkdirSync()并开启recursive: true参数避免层级创建报错 - 使用
fs.renameSync()完成文件移动
2. 按YYYY-MM分组文件
通过对象键值对实现分组:
- 定义一个空对象,键为
YYYY-MM格式字符串,值为对应时间段的文件路径数组 - 遍历文件时,将文件路径归入对应键的数组中,最终得到分组后的文件集合
完整实现代码
const fs = require('fs'); const path = require('path'); // 目标文件夹路径(要整理的文件所在文件夹) const targetFolder = '/Users/myuser/targetFolder'; try { // 获取文件夹下所有文件/文件夹 const files = fs.readdirSync(targetFolder); // 初始化分组对象 const fileGroups = {}; // 遍历所有条目,过滤出文件并分组 files.forEach(item => { const itemPath = path.join(targetFolder, item); const stat = fs.statSync(itemPath); // 只处理文件,跳过文件夹 if (stat.isFile()) { // 获取创建时间并格式化为YYYY-MM const birthtime = stat.birthtime; const dateKey = new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: '2-digit' }).format(birthtime); // 归入对应分组 if (!fileGroups[dateKey]) { fileGroups[dateKey] = []; } fileGroups[dateKey].push(itemPath); } }); // 遍历分组,创建文件夹并移动文件 Object.entries(fileGroups).forEach(([dateFolder, filePaths]) => { const folderPath = path.join(targetFolder, dateFolder); // 创建文件夹(如果不存在),recursive: true允许创建多级目录 if (!fs.existsSync(folderPath)) { fs.mkdirSync(folderPath, { recursive: true }); } // 移动每个文件到对应文件夹 filePaths.forEach(filePath => { const fileName = path.basename(filePath); const targetFilePath = path.join(folderPath, fileName); // 移动文件,若目标文件已存在可根据需求添加覆盖逻辑 fs.renameSync(filePath, targetFilePath); console.log(`已移动文件: ${fileName} -> ${dateFolder}`); }); }); console.log('文件归类完成'); } catch (err) { console.error('处理出错:', err); }
关键点说明
- 跨平台时间兼容性:
stat.birthtime是NodeJS标准的文件创建时间属性,无需针对不同系统做特殊处理 - 日期格式化:使用
Intl.DateTimeFormat是更简洁的国际化格式化方式,也可以手动通过getFullYear()、getMonth()拼接字符串(注意月份从0开始,需+1后补零) - 文件夹创建:
{ recursive: true }参数确保即使父目录不存在也能创建成功,避免手动判断层级的繁琐 - 错误处理:外层try-catch捕获全局错误,也可以在文件移动时单独添加错误处理,避免单个文件失败导致整个流程中断
内容的提问来源于stack exchange,提问作者usernameabc
相关产品推荐
相关产品推荐

