node文件批量重命名的方法示例


Posted in Javascript onOctober 23, 2017

在一个实际需求中,需要对一批文件(如:文本、图片)进行重命名,按照数字编号。正好借此熟悉了一下node的fs文件操作,写了一个批量修改文件名的脚本。

需求

现有以下图片文件

node文件批量重命名的方法示例

需要批量修改文件名称,变为统一前缀名称并且自增索引,修改后效果

node文件批量重命名的方法示例

最简单的人力操作就是逐个文件重命名,但本着DRY(Don't repeat yourself)原则,还是写一个node脚本搞定。

研究

node中要进行文件操作需要了解一下fs模块

在fs模块中有同步和异步两种方式

读取文件

//异步
fs.readFile('test.txt', 'utf-8' (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
});

//同步
let data = fs.readFileSync('test.txt');
console.log(data);

异步读取文件参数:文件路径,编码方式,回调函数

写入文件

fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
  if (err) {
    throw err;
  }
  console.log('saved');
});

写入文件参数:目标文件,写入内容,写入形式,回调函数

flag写入方式:

r:读取文件
w:写文件
a:追加

创建目录

fs.mkdir('dir', (err) => {
  if (err) {
    throw err;
  }
  console.log('make dir success');
});

dir为新建目录名称

读取目录

fs.readdir('dir',(err, files) => {
  if (err) {
    throw err;
  }
  console.log(files);
});

dir为读取目录名称,files为目录下的文件或目录名称数组

获取文件信息

fs.stat('test.txt', (err, stats)=> {
  console.log(stats.isFile());     //true
})

获取文件信息后stats方法:

方法 说明
stats.isFile() 是否为文件
stats.isDirectory() 是否为目录
stats.isBlockDevice() 是否为块设备
stats.isCharacterDevice() 是否为字符设备
stats.isSymbolicLink() 是否为软链接
stats.isFIFO() 是否为UNIX FIFO命令管道
stats.isSocket() 是否为Socket

创建读取流

let stream = fs.createReadStream('test.txt');

创建写入流

let stream = fs.createWriteStreamr('test_copy.txt');

开发

开发思路:

  1. 读取源目录
  2. 判读存放目录是否存在,不存在时新建目录
  3. 复制文件
  4. 判断复制内容是否为文件
  5. 创建读取流
  6. 创建写入流
  7. 链接管道,写入文件内容
let fs = require('fs'),
  src = 'src',
  dist = 'dist',
  args = process.argv.slice(2),
  filename = 'image',
  index = 0;

//show help
if (args.length === 0 || args[0].match('--help')) {
  console.log('--help\n \t-src 文件源\n \t-dist 文件目标\n \t-n 文件名\n \t-i 文件名索引\n');
  return false;
}

args.forEach((item, i) => {
  if (item.match('-src')) {
    src = args[i + 1];
  } else if (item.match('-dist')) {
    dist = args[i + 1];
  } else if (item.match('-n')) {
    filename = args[i + 1];
  } else if (item.match('-i')) {
    index = args[i + 1];
  }
});

fs.readdir(src, (err, files) => {
  if (err) {
    console.log(err);
  } else {
    fs.exists(dist, exist => {
      if (exist) {
        copyFile(files, src, dist, filename, index);
      } else {
        fs.mkdir(dist, () => {
          copyFile(files, src, dist, filename, index);
        })
      }
    });
  }
});

function copyFile(files, src, dist, filename, index) {
  files.forEach(n => {
    let readStream,
      writeStream,
      arr = n.split('.'),
      oldPath = src + '/' + n,
      newPath = dist + '/' + filename + index + '.' + arr[arr.length - 1];
    fs.stat(oldPath, (err, stats) => {
      if (err) {
        console.log(err);
      } else if (stats.isFile()) {
        readStream = fs.createReadStream(oldPath);
        writeStream = fs.createWriteStream(newPath);
        readStream.pipe(writeStream);
      }
    });
    index++;
  })
}

效果

node文件批量重命名的方法示例

总结

node提供了很多模块可以帮助我们完成不同需求的功能开发,使javascript不仅仅局限与浏览器中,尝试自己编写一些脚本有助于对这些模块的理解,同时也能提高办公效率。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery常用技巧及常用方法列表集合
Apr 06 Javascript
jquery maxlength使用说明
Sep 09 Javascript
游览器中javascript的执行过程(图文)
May 20 Javascript
Javascript中3个需要注意的运算符
Apr 02 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
jquery日历插件e-calendar升级版
Nov 10 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 Javascript
canvas 实现中国象棋
Feb 17 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
Jan 08 jQuery
抖音上用记事本编写爱心小程序教程
Apr 17 Javascript
详解vue 实例方法和数据
Oct 23 #Javascript
深入浅析javascript继承体系
Oct 23 #Javascript
Vue.js组件通信的几种姿势
Oct 23 #Javascript
Vue2.0+ElementUI实现表格翻页的实例
Oct 23 #Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 #Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 #Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 #Javascript
You might like
mysql 性能的检查和优化方法
2009/06/21 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php实现的操作excel类详解
2016/01/15 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
Python实现一个简单的MySQL类
2015/01/07 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
django ORM之values和annotate使用详解
2020/05/19 Python
python实现代码审查自动回复消息
2021/02/01 Python
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
Python3中最常用的5种线程锁实例总结
2021/07/07 Python