使用Node实现简单的批量修改文件名命令行功能

2,674 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

相关简介

  • 前言 在使用电脑时,免不了操作文件夹或者文件,其中重命名文件名是日常最熟悉的操作之一了,但是当需要重命名的文件数量比较多时,手动就比较麻烦了,所以会通过学习命令行工具来进行操作。这里,就通过使用Node来实现一个简单的批量重命名文件的功能。

  • 介绍

使用命令行的方式是程序员必备的一个操作,通过在终端中输入对应的命令,就能实现对应的功能。例如:cp -r a/ b/就是把a目录复制到b目录。接下来,要实现的Node文件重命名充能就利用类似的命令操作来实现效果。

开始实现

process

Node中,如果需要解析执行Node时命令行的参数,则需要通过process进程模块argv参数来实现,从官网可以得知其用法:

image.png

process.argv的前两个参数中,是系统的Node路径和执行文件的路径,剩余的参数则是通过在命令行里面附加的,基于此就能很方便的获取到命令行的参数。

fs

要实现文件的重命名功能,需要使用fs文件模块rename方法来实现,其用法如下图:

image.png

但是该方法一次只能重命名一个文件,所以接下来就需要通过编码来实现了,思路如下:

  1. 该功能需要在命令行传入两个参数,第一个是修改路径(带正则表达式),第二个是需要重新命名的名称;
  2. 使用fs模块读取对应的目录后,遍历所有文件,进行正则和文件名的匹配;
  3. 将匹配到的名称,使用replace方法进行替换,然后使用rename进行文件重命名。

参数获取

首先,通过引入模块后然后根据命令行参数获取需要的属性(这里不做非空等安全验证),代码如下:

const fs = require('fs')
const path = require('path')
const process = require('process')

const [iptPath, newName] = process.argv.slice(2)
const name = path.basename(iptPath)
const dir = path.dirname(iptPath)

上面的basename获取路径名最后的文件名称,如a/b/c.txt经过basename方法执行后会返回c.txt字符串,而dirname则会返回a/b这个最后一级的目录。

接着,在通过readdirSync获取dir目录的所有子文件,因为该目录中可能会有其他目录,所以需要进行一个文件类型的判断:

const files = fs.readdirSync(path.resolve(dir))
files.forEach(file => {
  const filePath = path.resolve(dir, file)
  const stat = fs.statSync(filePath)
  if (!stat.isDirectory()) {
    // TODO
  }
})

注意
读取文件路径时,最好使用resolve来拼接并生成一个绝对路径,避免因为路径出错的原因导致Bug出现。

获取到所有的文件之后,就实现最后也是最关键的一个步骤了,通过正则匹配然后重用replace搭配rename来实现文件的重命名功能,代码如下:

const res = file.match(new RegExp(name))
if (res && res[1]) {
  fs.renameSync(filePath, path.resolve(dir, file.replace(res[1], newName)))
}

上面代码通过match方法来判断正则表达式括号里面的值是否被匹配到,如果匹配到则进行文件的修改,否则就会忽略到该文件,进行下一个文件的匹配和修改,最终效果图如下:

node01.gif

至此,就已经基于Node实现了一个简单的批量重命名文件的功能了:)