R语言 如何创建多代目录即子目录层的csv文件

n9vozmp4  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(248)

我有一个很大的目录,里面有很多层/代的目录,比如说5层。我试图计数最后一代子目录的出现/存在(而不是最后子目录中的文件)。
例如父目录(gen 1)和gen 1(gen 2)中的所有子目录和gen 2(gen 3)中的所有子目录和gen 3(gen 4)中的所有子目录和gen 4(gen 5)中的所有子目录
为此,我想创建一个包含所有5代目录名称的.csv文件,这样csv文件中的每一行都将显示最终的子目录名称(gen 5)和所有上面的父目录(gen 4、3、2、1),并以列分隔。然后,我可以通过按目录名称过滤来计算不同级别的目录出现次数。
每一级有不同数量的子目录。例如gen 2有4个文件夹-〉Folder 1 = 8个子目录,Folder 2 = 12个子目录,Folder 3 = 6个子目录,Folder 4 = 15个子目录等等。
我在Windows上使用R,并尝试应用列表.dirs()和列表.files(),但无法手动单独列出每个子目录,并且不知道如何排除这些文件--这使得我的R崩溃,因为文件太大了。当然我可以吐出一个csv文件,显示多代目录的名称吗?努力找到一个代码,排除文件,只吐出目录。
我希望输出如下所示:

mrfwxfqh

mrfwxfqh1#

下面的函数沿着目录树向下递归,每找到一个叶子就加1。或者,它会将叶子的名字保存在一个文件中。

count_dirs <- function(path = ".", savefile = FALSE, filename) {
  f <- function(path) {
    if(dir.exists(paths = path)) {
      dir_vec <- list.dirs(path = path, full.names = TRUE, recursive = FALSE)
      if(length(dir_vec) == 1L) {
        e$n <- e$n + 1L
        if(savefile) {
          df1 <- data.frame(directory = dir_vec)
          write.table(
            df1, e$outfile, 
            quote = FALSE, 
            row.names = FALSE, col.names = FALSE,
            append = TRUE
          )
        }
      } else {
        for(d in dir_vec)  Recall(path = d)
      }
    }
  }
  e <- new.env()
  e$n <- 0L
  if(savefile) {
    e$outfile <- filename
    df1 <- data.frame(directory = character(0))
    write.table(df1, e$outfile, quote = FALSE, row.names = FALSE)
  }
  path <- normalizePath(path = path)
  if(.Platform$OS.type == "windows") {
    path <- chartr("\\", "/", path)
  }
  f(path = path)
  e$n
}

# sample usage    
tmpfile <- tempfile(fileext = ".dat")
count_dirs(savefile = TRUE, filename = tmpfile)
# [1] 79

# tidy up
#unlink(tmpfile)

相关问题