在日常开发中,我们经常会遇到需要批量重命名文件的需求。本文将介绍一个使用Node.js编写的脚本,它可以遍历指定目录下的所有文件夹,并将每个文件夹中的文件按照修改时间排序,重命名为 文件夹名称-序号 的形式。

脚本功能概述

这个脚本的主要功能是:

  • 自动遍历 ./src/ 目录下的每个文件夹。
  • 按照文件的修改时间对每个文件夹中的文件进行排序。
  • 依次将文件重命名为 文件夹名称-序号.扩展名 的形式,确保文件名唯一且具有一定的可读性。

为什么选择Node.js?

Node.js以其非阻塞、事件驱动的特性,非常适合处理I/O密集型任务。使用Node.js编写脚本可以充分利用其强大的文件系统模块 fs 和路径处理模块 path,实现高效的文件操作。

完整的脚本代码

以下是实现上述功能的完整Node.js脚本代码:

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

// 定义目标目录
const targetDir = path.join(__dirname, './src');

// 读取目录中的所有文件夹
fs.readdir(targetDir, (err, folders) => {
  if (err) {
    return console.error('无法读取目录:', err);
  }

  folders.forEach(folder => {
    const folderPath = path.join(targetDir, folder);

    // 检查是否是文件夹
    fs.stat(folderPath, (err, stats) => {
      if (err) {
        return console.error('无法获取文件夹状态:', err);
      }

      if (stats.isDirectory()) {
        processFolder(folderPath, folder);
      }
    });
  });
});

function processFolder(folderPath, folderName) {
  fs.readdir(folderPath, (err, files) => {
    if (err) {
      return console.error('无法读取文件夹:', err);
    }

    const fileData = [];

    // 获取每个文件的状态信息
    files.forEach(file => {
      const filePath = path.join(folderPath, file);

      fs.stat(filePath, (err, stats) => {
        if (err) {
          return console.error('无法获取文件状态:', err);
        }

        fileData.push({
          file,
          filePath,
          mtime: stats.mtime
        });

        // 在所有文件信息获取完毕后进行处理
        if (fileData.length === files.length) {
          renameFiles(fileData, folderPath, folderName);
        }
      });
    });
  });
}

function renameFiles(fileData, folderPath, folderName) {
  // 按修改时间排序
  fileData.sort((a, b) => a.mtime - b.mtime);

  let counter = 0;

  fileData.forEach(data => {
    // 获取文件扩展名
    const fileExt = path.extname(data.file);
    const newFileName = `${folderName}-${counter}${fileExt}`;

    const newFilePath = path.join(folderPath, newFileName);

    // 重命名文件
    fs.rename(data.filePath, newFilePath, err => {
      if (err) {
        return console.error('无法重命名文件:', err);
      }

      console.log(`文件重命名成功: ${data.file} -> ${newFileName}`);
    });

    counter++;
  });
}

如何使用

  1. 准备目录结构:确保你的项目目录结构如下:

    your-project/
    ├── renameFolders.js
    └── src/
        ├── folder1/
        │   ├── file1.txt
        │   └── file2.txt
        └── folder2/
            ├── file3.txt
            └── file4.txt
  2. 保存脚本:将上面的代码保存为 renameFolders.js 文件,放在项目的根目录中。

  3. 运行脚本:在终端中运行以下命令:

    node renameFolders.js
  4. 查看结果:脚本会自动遍历 ./src/ 目录下的每个文件夹,并将文件夹中的文件按照修改时间排序并重命名为 文件夹名称-序号.扩展名 的形式。

结果示例

假设你的 ./src/ 目录结构如下:

src/
├── folder1/
│   ├── file1.txt
│   └── file2.txt
└── folder2/
    ├── file3.txt
    └── file4.txt

运行脚本后,文件将被重命名为:

src/
├── folder1/
│   ├── folder1-0.txt
│   └── folder1-1.txt
└── folder2/
    ├── folder2-0.txt
    └── folder2-1.txt

注意事项

  • 备份数据:重命名操作不可逆,建议在运行脚本前备份数据。
  • 目录要求:确保 ./src/ 目录下只有文件夹,脚本会遍历所有子目录并重命名其中的文件。

许可证

此脚本使用MIT许可证。以下是MIT许可证的完整内容:

MIT License

Copyright (c) 2024 [QiuYeDx]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

通过上述步骤,你可以轻松地批量重命名文件,提升工作效率。如果你有任何问题或改进建议,欢迎在评论区留言!


希望这篇博客对你有所帮助。如果你觉得有用,请分享给你的朋友或同事,并在评论区留下你的反馈。谢谢阅读!


A Student on the way to full stack of Web3.