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