Nim 递归查找特定文件,删除所在目录

要求:从三个同步目录下分别选择性地删除上千个文件夹,每个待删除文件夹里都有 index.md 文件

如果手动删除,效率低不说,还容易出错。于是 海云青飞 写了 Nim 代码辅助工作

  • 从一个同步目录里手动剪切出待删除的目录,移到上级目录的 to_del 文件夹内
  • 用 Nim 程序递归搜索 to_del 文件夹,找到 index.md 文件,就把文件所在文件夹的绝对路径加入 seq[string] 表中,最后写入 dirList.txt
  • 用 Nim 程序读取 dirList.txt,删除其他二个同步目录中的相应文件夹
#[

# 海云青飞 https://www.tuenhai.com
# 2024-09-06

 Nim 编程语言 2.0

依文件名特征查找文件,批量删除文件所在文件夹

]#

import os, strutils, std/syncio

# 递归搜索文件名,返回包含文件所在文件夹的 seq[string]
proc findDirs(path: string, nameEnds: string): seq[string] =
  for file in walkDirRec(path):
    if file.endsWith(nameEnds):
      result.add(file.parentDir())

# 一个文本文件的绝对路径,里面有按行分隔的待删除文件夹的绝对路径。默认与可执行文件同目
proc dirListPath(outputName: string): string =
  getAppDir() / outputName

# 把所有待删除文件夹的绝对路径写入文本文件
proc writeDirList(dirList: seq[string], path: string) =
  writeFile(path, dirList.join("\n"))

# 删除一个指定绝对路径的文件夹,如果出错,则打印路径,方便手动处理
proc deleteFolder(path: string) =
  if dirExists(path):
    try:
      removeDir(path)
      #echo "Folder deleted successfully: ", path
    except OSError:
      echo path, "   -- Error deleting folder"
      echo getCurrentExceptionMsg()
  else:
    echo "Folder does not exist: ", path

# 批量删除文本文件中列出的文件夹
proc deleteDirs(dirListPath: string ) =
  let s = readFile(dirListPath)
  let dirs = splitLines(s)
  for dir in dirs:
    deleteFolder(dir)

proc main() =
  let
    dirToSearch = r"C:\Users\tuenhai.com\to_del"
    nameEnds = "index.md"
    outputName = "dirList.txt"
    dirList = findDirs(dirToSearch, nameEnds)
    path = dirListPath(outputName)
  writeDirList(dirList, path)
  deleteDirs( path )

when isMainModule:
  main()

2024-09-06


独立思考最难得,赞赏支持是美德!(微信扫描下图)