使用在文件中找到的 'date' 重命名“.txt”文件的批处理脚本
batch script to rename '.txt' files, by using 'date' found within file
我从这个逻辑开始:
const fs = require("fs")
// Read directory
fs.readdir("./", (err, files) => {
for (const file of files) {
if (/[A-Z]/g.test(file)) {
fs.rename(file, 'newFile.txt', (err) => {
console.log('Renaming', file, "to", "newFile.txt")
if (err) throw err
})
}
}
})
我基本上想遍历一个包含几十个 .txt
文件的目录。我想搜索在每个 .txt
文件中找到的日期,并将其用作文件的新名称。
例如在每个文本文件中,可以在其中找到它(这种格式的日期)
2015-12-21
我想遍历 .txt 文件的目录,搜索并找到这种格式的日期 (XXXX-XX-XX
),然后将其用作文件的新名称。
我认为这可能是查找日期的正则表达式:
([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))
下面是一个文本文件内容的例子,它有多个内容如下: 你会注意到右边的日期,有多个这样列出的日期,但它们都是一样的;所以我只需要抓住它并将其用作更新的文件名。
PRIORITY GOAL IN_PROGRESS_SINCE SOURCE TYPE
-------- ------------------------------------------------------------------- ----------------- ------- --------------------
4 Has received blahblahblah on improving physical activity 2015-12-21 15:51 MEMBER NULL
BARRIER SENSITIVE STATUS NOTE
---- ---- -------------------- --------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Needs counseling on No Not Met
您可以使用正则表达式搜索日期:
// dir is the directory containing the file
// Specify utf8 as encoding to get a string
let fileContents = fs.readFileSync(path.join(dir, /*fs.Dirent*/file.name), 'utf8')
let dateMatches = fileContents.match(/[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/)
如果有日期,dateMatches
将是一个长度大于零的数组。第一个元素将包含文件内容中遇到的第一个日期。
const fs = require('fs')
const path = require('path')
// Change ./example to whatever you like
let dir = './example'
fs.readdir(dir, {
encoding: 'utf8',
withFileTypes: true
}, (err, files) => {
if (err) {
// Error happened when reading the directory
console.error(err)
return
}
for (const file of files) {
if (!file.isFile()) {
// Directory or block device?
continue;
}
// Read file contents
let fileContents = fs.readFileSync(path.join(dir, file.name), 'utf8')
let dateMatches = fileContents.match(/[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/)
if (dateMatches) {
// There is a date here
fs.rename(path.join(dir, file.name), path.join(dir, dateMatches[0]), (err) => {
if (err) {
console.error(err)
// Do your error handling stuff here...
return
} else {
console.log('Renamed', file.name, 'to', dateMatches[0])
}
})
}
}
})
请注意,该文件可能包含无效日期,例如 2018-02-30。如果这对您来说是个问题,您可以使用 Date.parse
or use a library such as Moment.js.
验证日期
您可能需要查看 Node.js documentation 了解详细信息。
例如,如果 ./example/file1.txt
将包含以下内容:
DATE
====
2019-01-01
1970-12-31
执行上面的程序会将其重命名为 ./example/2019-01-01
.
我从这个逻辑开始:
const fs = require("fs")
// Read directory
fs.readdir("./", (err, files) => {
for (const file of files) {
if (/[A-Z]/g.test(file)) {
fs.rename(file, 'newFile.txt', (err) => {
console.log('Renaming', file, "to", "newFile.txt")
if (err) throw err
})
}
}
})
我基本上想遍历一个包含几十个 .txt
文件的目录。我想搜索在每个 .txt
文件中找到的日期,并将其用作文件的新名称。
例如在每个文本文件中,可以在其中找到它(这种格式的日期) 2015-12-21
我想遍历 .txt 文件的目录,搜索并找到这种格式的日期 (XXXX-XX-XX
),然后将其用作文件的新名称。
我认为这可能是查找日期的正则表达式:
([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))
下面是一个文本文件内容的例子,它有多个内容如下: 你会注意到右边的日期,有多个这样列出的日期,但它们都是一样的;所以我只需要抓住它并将其用作更新的文件名。
PRIORITY GOAL IN_PROGRESS_SINCE SOURCE TYPE
-------- ------------------------------------------------------------------- ----------------- ------- --------------------
4 Has received blahblahblah on improving physical activity 2015-12-21 15:51 MEMBER NULL
BARRIER SENSITIVE STATUS NOTE
---- ---- -------------------- --------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Needs counseling on No Not Met
您可以使用正则表达式搜索日期:
// dir is the directory containing the file
// Specify utf8 as encoding to get a string
let fileContents = fs.readFileSync(path.join(dir, /*fs.Dirent*/file.name), 'utf8')
let dateMatches = fileContents.match(/[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/)
如果有日期,dateMatches
将是一个长度大于零的数组。第一个元素将包含文件内容中遇到的第一个日期。
const fs = require('fs')
const path = require('path')
// Change ./example to whatever you like
let dir = './example'
fs.readdir(dir, {
encoding: 'utf8',
withFileTypes: true
}, (err, files) => {
if (err) {
// Error happened when reading the directory
console.error(err)
return
}
for (const file of files) {
if (!file.isFile()) {
// Directory or block device?
continue;
}
// Read file contents
let fileContents = fs.readFileSync(path.join(dir, file.name), 'utf8')
let dateMatches = fileContents.match(/[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/)
if (dateMatches) {
// There is a date here
fs.rename(path.join(dir, file.name), path.join(dir, dateMatches[0]), (err) => {
if (err) {
console.error(err)
// Do your error handling stuff here...
return
} else {
console.log('Renamed', file.name, 'to', dateMatches[0])
}
})
}
}
})
请注意,该文件可能包含无效日期,例如 2018-02-30。如果这对您来说是个问题,您可以使用 Date.parse
or use a library such as Moment.js.
您可能需要查看 Node.js documentation 了解详细信息。
例如,如果 ./example/file1.txt
将包含以下内容:
DATE
====
2019-01-01
1970-12-31
执行上面的程序会将其重命名为 ./example/2019-01-01
.