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 19 Javascript
区分JS中的undefined,null,"",0和false
Mar 08 Javascript
JavaScript中的undefined学习总结
Nov 30 Javascript
使用documentElement正确取得当前可见区域的大小
Jul 25 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
Jan 05 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
详解vue 不同环境配置不同的打包命令
Apr 07 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
微信小程序实现同时上传多张图片
Feb 03 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 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实现今天是星期几的几种写法
2013/09/26 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
Python类的专用方法实例分析
2015/01/09 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
优秀求职自荐信怎样写
2013/12/18 职场文书
小学教师寄语大全
2014/04/03 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
公司人事管理制度
2015/08/05 职场文书
教师理论学习心得体会
2016/01/21 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
七年级上册生物的课件
2019/08/07 职场文书