node文件批量重命名的方法示例
在一個(gè)實(shí)際需求中,需要對一批文件(如:文本、圖片)進(jìn)行重命名,按照數(shù)字編號。正好借此熟悉了一下node的fs文件操作,寫了一個(gè)批量修改文件名的腳本。
需求
現(xiàn)有以下圖片文件
需要批量修改文件名稱,變?yōu)榻y(tǒng)一前綴名稱并且自增索引,修改后效果
最簡單的人力操作就是逐個(gè)文件重命名,但本著DRY(Don't repeat yourself)原則,還是寫一個(gè)node腳本搞定。
研究
node中要進(jìn)行文件操作需要了解一下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);
異步讀取文件參數(shù):文件路徑,編碼方式,回調(diào)函數(shù)
寫入文件
fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => { if (err) { throw err; } console.log('saved'); });
寫入文件參數(shù):目標(biāo)文件,寫入內(nèi)容,寫入形式,回調(diào)函數(shù)
flag寫入方式:
r:讀取文件
w:寫文件
a:追加
創(chuàng)建目錄
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為目錄下的文件或目錄名稱數(shù)組
獲取文件信息
fs.stat('test.txt', (err, stats)=> { console.log(stats.isFile()); //true })
獲取文件信息后stats方法:
方法 | 說明 |
---|---|
stats.isFile() | 是否為文件 |
stats.isDirectory() | 是否為目錄 |
stats.isBlockDevice() | 是否為塊設(shè)備 |
stats.isCharacterDevice() | 是否為字符設(shè)備 |
stats.isSymbolicLink() | 是否為軟鏈接 |
stats.isFIFO() | 是否為UNIX FIFO命令管道 |
stats.isSocket() | 是否為Socket |
創(chuàng)建讀取流
let stream = fs.createReadStream('test.txt');
創(chuàng)建寫入流
let stream = fs.createWriteStreamr('test_copy.txt');
開發(fā)
開發(fā)思路:
- 讀取源目錄
- 判讀存放目錄是否存在,不存在時(shí)新建目錄
- 復(fù)制文件
- 判斷復(fù)制內(nèi)容是否為文件
- 創(chuàng)建讀取流
- 創(chuàng)建寫入流
- 鏈接管道,寫入文件內(nèi)容
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 文件目標(biāo)\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++; }) }
效果
總結(jié)
node提供了很多模塊可以幫助我們完成不同需求的功能開發(fā),使javascript不僅僅局限與瀏覽器中,嘗試自己編寫一些腳本有助于對這些模塊的理解,同時(shí)也能提高辦公效率。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pnpm workspace管理monorepo項(xiàng)目使用過程詳解
這篇文章主要為大家介紹了pnpm workspace管理monorepo項(xiàng)目使用過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10我的Node.js學(xué)習(xí)之路(二)NPM模塊管理
npm 是 Node.js 的模塊依賴管理工具。作為開發(fā)者使用的工具,主要解決開發(fā) Node.js 時(shí)會(huì)遇到的問題。如同 RubyGems 對于 Ruby 開發(fā)者和 Maven 對于 Java 開發(fā)者的重要性,npm 對與 Node.js 的開發(fā)者和社區(qū)的重要性不言而喻。2014-07-07新手必須知的Node.js 4個(gè)JavaScript基本概念
本文介紹了4個(gè)基本JavaScript概念,它是你學(xué)習(xí)node.js所必需要掌握,下面就讓我們來看一下具體是哪4個(gè)基本JavaScript概念2018-09-09nodejs構(gòu)建本地web測試服務(wù)器 如何解決訪問靜態(tài)資源問題
這篇文章主要為大家詳細(xì)介紹了nodejs構(gòu)建本地web測試服務(wù)器,教大家如何解決訪問靜態(tài)資源問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Node.js學(xué)習(xí)之查詢字符串解析querystring詳解
這篇文章主要給大家介紹了關(guān)于Node.js查詢字符串解析querystring的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-09-09Node.js實(shí)現(xiàn)批量替換文件內(nèi)容示例
這篇文章主要為大家介紹了Node.js實(shí)現(xiàn)批量替換文件內(nèi)容示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08如何在命令行判斷node.js啟動(dòng)了沒有(最新)
這篇文章主要介紹了如何在命令行判斷node.js啟動(dòng)了沒有,使用 tasklist 命令列出所有正在運(yùn)行的進(jìn)程,并使用 findstr 命令過濾出 Node.js 進(jìn)程,感興趣的朋友跟隨小編一起看看吧2024-06-06