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 相关文章推荐
网页里控制图片大小的相关代码
Jun 25 Javascript
JavaScript与DropDownList 区别分析
Jan 01 Javascript
javascript测试题练习代码
Oct 10 Javascript
js 获取radio按钮值的实例
Aug 17 Javascript
在JavaScript中操作时间之getMonth()方法的使用
Jun 10 Javascript
JavaScript函数节流和函数防抖之间的区别
Feb 15 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
JavaScript实现全选取消效果
Dec 14 Javascript
vue初尝试--项目结构(推荐)
Jan 30 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
layui 实现表单和文件上传一起传到后台的例子
Sep 16 Javascript
javascript前端和后台进行数据交互方法示例
Aug 07 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
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python中的迭代器漫谈
2015/02/03 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
详解python的变量缓存机制
2021/01/24 Python
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
法律专业实习鉴定
2013/12/22 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
工程安全生产协议书
2014/11/21 职场文书