使用在文件中找到的 '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.