You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NodeJS按文件创建日期(YYYY-MM)将文件归类到对应文件夹

NodeJS实现按文件创建日期YYYY-MM格式归类文件

问题

  1. 如何获取文件创建日期并据此将文件移动到YYYY-MM格式的文件夹?
  2. 如何按文件创建日期的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:40:06