/

使用Node.js一次遞增多個文件夾的數字

使用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,並選擇使用命令行參數來設置我想要從哪個數字開始,像這樣:

1
node rename.js 4

獲取數字很簡單,從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”]