用node.js写个脚本一键复制文件及目录

276 阅读1分钟

1.需求分析:

  • 场景:公司旧项目全是html堆叠,每次更新大版本文件仍需要手动一个个复制、替换已修改过的文件
  • 需求:能不能写个脚本,只输入路径,就能一键复制目录及文件(复制后的文件路径也得一致),不用一个个创建相同路径的文件夹再复制,直接替换即可
  • 环境:需安装node.js或 安装code runner插件右键run code执行

2.运行

  • 1.将CopyFiles.js放到目标项目(要复制的文件)根目录下 image.png
  • 2.修改CopyFiles.js文件,在inputFiles输入要复制的路径文件(若为文件路径,则复制该文件,若为目录路径,则复制目录下所有文件)

image.png

  • 3.修改新项目名称
  • 4.执行

image.png

3.CopyFiles.js代码

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

/* 修改1:输入的文件路径数组(相对路径)
* 若为目录路径,则复制目录下所有文件
* 若为文件路径,则复制该文件
*/
const inputFiles = [
  "./pages/MSD/SalesOrderList",
  // "./pages/SFC/DeliveryNoteDetails"
];

// 修改2:新项目的根目录(相对路径,基于当前脚本所在目录)
const newProjectRoot = "./h5_copy_20250304";


// 删除目录的函数
function deleteDirectory(dir) {
    if (fs.existsSync(dir)) {
        // 递归删除目录内容
        const files = fs.readdirSync(dir);
        for (const file of files) {
            const filePath = path.join(dir, file);
            const stat = fs.statSync(filePath);
            if (stat.isDirectory()) {
                // 如果是目录,递归删除
                deleteDirectory(filePath);
            } else {
                // 如果是文件,直接删除
                fs.unlinkSync(filePath);
            }
        }
        // 删除空目录
        fs.rmdirSync(dir);
        console.log(`已删除目录: ${dir}`);
    }
}

// 复制文件或目录的函数
function copyFileOrDir(src, dest) {
    const stat = fs.statSync(src);

    if (stat.isFile()) {
        // 如果是文件,直接复制
        const dirname = path.dirname(dest);
        if (!fs.existsSync(dirname)) {
            fs.mkdirSync(dirname, { recursive: true });
        }
        fs.copyFileSync(src, dest);
        console.log(`文件已复制: ${src} -> ${dest}`);
    } else if (stat.isDirectory()) {
        // 如果是目录,递归复制目录下的所有文件
        if (!fs.existsSync(dest)) {
            fs.mkdirSync(dest, { recursive: true });
        }
        const files = fs.readdirSync(src);
        for (const file of files) {
            const srcFile = path.join(src, file);
            const destFile = path.join(dest, file);
            copyFileOrDir(srcFile, destFile);
        }
        console.log(`目录已复制: ${src} -> ${dest}`);
    }
}

// 主函数
function copyFilesToNewProject(inputFiles, newProjectRoot) {
    // 将相对路径转换为绝对路径
    const scriptDir = __dirname; // 当前脚本所在目录
    const absoluteNewProjectRoot = path.resolve(scriptDir, newProjectRoot);

    // 删除新项目根目录(如果存在)
    deleteDirectory(absoluteNewProjectRoot);

    // 重新创建新项目根目录
    fs.mkdirSync(absoluteNewProjectRoot, { recursive: true });
    console.log(`已创建目录: ${absoluteNewProjectRoot}`);

    // 复制文件或目录
    for (const inputPath of inputFiles) {
        const src = path.resolve(scriptDir, inputPath); // 将输入路径转换为绝对路径
        // 计算相对路径(相对于脚本所在目录)
        const relativePath = path.relative(scriptDir, src);
        // 构建目标路径
        const dest = path.join(absoluteNewProjectRoot, relativePath);
        copyFileOrDir(src, dest);
    }
}

// 执行复制操作
copyFilesToNewProject(inputFiles, newProjectRoot);