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