如何在Node.js中无第三方模块按类型批量移动文件
在Node.js中无需第三方模块批量移动同类型文件
当然可以实现!你遇到的问题是因为Node.js的fs.rename本身只支持单个文件的操作,不像CMD的move命令那样自带通配符解析能力,但我们完全可以用Node.js内置模块来实现批量移动同类型文件的需求,不需要第三方包,也不需要构建JSON对象。
方案1:同步方式(适合简单脚本场景)
这种方式代码直观,适合不需要考虑事件循环阻塞的小型脚本:
const fs = require('fs'); const path = require('path'); // 用path模块处理路径更可靠,适配不同操作系统 // 定义源目录和目标目录 const sourceDir = './'; const targetDir = './dir'; // 先确保目标目录存在,不存在则创建(支持多级目录) if (!fs.existsSync(targetDir)) { fs.mkdirSync(targetDir, { recursive: true }); } // 读取源目录下的所有文件 const files = fs.readdirSync(sourceDir); // 遍历文件,筛选并移动所有.txt文件 files.forEach(file => { // 检查文件扩展名是否为.txt(忽略大小写) if (path.extname(file).toLowerCase() === '.txt') { const sourcePath = path.join(sourceDir, file); const targetPath = path.join(targetDir, file); try { fs.renameSync(sourcePath, targetPath); console.log(`已成功移动: ${file}`); } catch (err) { console.error(`移动文件${file}失败:`, err.message); } } }); console.log('批量移动任务完成!');
方案2:异步Promise方式(适合非阻塞场景)
如果你的应用需要保持事件循环不阻塞,推荐使用异步版本:
const fs = require('fs').promises; const path = require('path'); async function batchMoveTxtFiles() { const sourceDir = './'; const targetDir = './dir'; try { // 检查目标目录是否存在,不存在则创建 await fs.access(targetDir).catch(async () => { await fs.mkdir(targetDir, { recursive: true }); }); // 异步读取源目录文件列表 const files = await fs.readdir(sourceDir); // 并行处理所有符合条件的文件 await Promise.all(files.map(async file => { if (path.extname(file).toLowerCase() === '.txt') { const sourcePath = path.join(sourceDir, file); const targetPath = path.join(targetDir, file); await fs.rename(sourcePath, targetPath); console.log(`已成功移动: ${file}`); } })); console.log('批量移动任务完成!'); } catch (err) { console.error('批量移动过程中出现错误:', err.message); } } // 执行移动函数 batchMoveTxtFiles();
关键说明
- 为什么不能直接用
fs.rename(./*.txt, ...)?Node.js的fs模块方法不支持解析shell风格的通配符(比如*.txt),通配符解析是操作系统shell的功能,所以我们需要自己遍历目录并筛选文件。 - 使用
path模块处理路径可以避免手动拼接路径时出现的跨系统兼容问题(比如Windows用\,Linux/macOS用/)。 - 提前创建目标目录可以避免因目录不存在导致的移动失败。
内容的提问来源于stack exchange,提问作者Dan F
相关产品推荐
相关产品推荐

