使用Node.js一次遞增多個文件夾的數字
如何解決一個小型文件夾管理問題
我有一個問題。
我正在創建許多格式為以下的文件夾:
| 12
 3
 4
 5
 
 | 1-yo2-hey
 3-cool
 4-hi
 5-whatsup
 
 | 
一個數字後面跟著一個破折號和一個字符串。
我創建了40個這樣的文件夾,然後我意識到我必須在中間插入一個文件夾,像這樣:
| 12
 3
 4
 5
 6
 
 | 1-yo2-hey
 3-NEWONE
 3-cool
 4-hi
 5-whatsup
 
 | 
問題是,我必須更改所有的文件夾數字,現在它們應該跟隨3-NEWONE文件夾。
我希望最終的結果是這樣的,所有新條目後面的數字都是遞增的:
| 12
 3
 4
 5
 6
 
 | 1-yo2-hey
 3-NEWONE
 4-cool
 5-hi
 6-whatsup
 
 | 
我手動完成了一次,然後我意識到我將來肯定會重複這個過程,所以我使用Node.js命令行應用程序將其自動化。
我將文件命名為increment.js,並選擇使用命令行參數來設置我想要從哪個數字開始,像這樣:
獲取數字很簡單,從process.argv中獲取:
| 12
 
 | const args = process.argv.slice(2)const startingNumber = args[0]
 
 | 
如果沒有提供數字,我們將顯示錯誤並結束程序:
| 12
 3
 4
 
 | if (!startingNumber) {console.log('請添加一個數字參數')
 return
 }
 
 | 
現在我們有了這個數字,我們可以開始獲取我們需要遞增的文件夾名稱。腳本將位於包含所有子文件夾的同一文件夾中,所以我們可以從./讀取,這表示當前文件夾。
這是我們如何獲取當前文件夾中包含的所有文件和子文件夾的名稱:
| 12
 3
 4
 5
 6
 7
 
 | const fs = require('fs')
 const folders = fs
 .readdirSync('./')
 .map(fileName => {
 return fileName
 })
 
 | 
讓我們過濾一下,以確保我們只獲取文件夾:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | const fs = require('fs')
 const isFolder = fileName => {
 return !fs.lstatSync(fileName).isFile()
 }
 
 const folders = fs
 .readdirSync('./')
 .map(fileName => {
 return fileName
 })
 .filter(isFolder)
 
 | 
接下來,我們可以遍歷文件夾列表:
| 12
 3
 
 | folders.map(folder => {
 })
 
 | 
我從文件夾中提取數字:
| 12
 3
 
 | folders.map(folder => {const result = folder.match(/(\d)+/)
 })
 
 | 
如果匹配成功(文件夾名稱中有數字),我提取它並將其從字符串轉換為數字:
| 12
 3
 4
 5
 6
 
 | folders.map(folder => {const result = folder.match(/(\d)+/)
 if (result !== null) {
 const num = parseInt(result[0])
 }
 })
 
 | 
最後,如果數字比我們傳入的參數大,我們將重命名文件夾,將數字遞增:
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | folders.map(folder => {const result = folder.match(/(\d)+/)
 if (result !== null) {
 const num = parseInt(result[0])
 if (num >= startingNumber) {
 fs.renameSync(folder, folder.split(num).join(num + 1))
 }
 }
 })
 
 | 
就是這樣!這是我們小型命令行應用程序的最終源代碼:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 | const fs = require('fs')
 const args = process.argv.slice(2)
 const startingNumber = args[0]
 if (!startingNumber) {
 console.log('請添加一個數字參數')
 return
 }
 
 const isFolder = fileName => {
 return !fs.lstatSync(fileName).isFile()
 }
 
 const folders = fs
 .readdirSync('./')
 .map(fileName => {
 return fileName
 })
 .filter(isFolder)
 
 folders.map(folder => {
 const result = folder.match(/(\d)+/)
 if (result !== null) {
 const num = parseInt(result[0])
 if (num >= startingNumber) {
 fs.renameSync(folder, folder.split(num).join(num + 1))
 }
 }
 })
 
 | 
tags: [“Node.js”, “folders”, “file management”, “automation”]