根据文件名将文件移动到 R 中的子目录

问题描述

所以我想根据文件名中的某个部分将文件复制到特定文件夹。为了您的概述,我将我的文件夹结构放在下面。在文件夹 D0 和 D1 中,我有多个文件(例如,我将两个文件名称在这里)以及文件夹 Weather 和 Temperature。我想将 .txt 文件移动到文件夹 Weather 或 Temperature,具体取决于文件名中是否包含 Weather 或 Temperature(看看我想要什么)。

现状:

main Directory
|
|___ Experiment
        ├── D0
           ├── temperature
        │  └── Weather
           |__ Weather 100.txt
           |__ Temperature 100.txt
        └── D1
           ├── temperature
           └── weather
           |__ Weather 100.txt
           |__ Temperature 100.txt

我想要什么:

main Directory
    |
    |___ Experiment
            ├── D1
               ├── Weather
                        |__Weather 100.txt
               └── Temperature
                        |__ Temperature 100.txt

我尝试分步进行,因此首先使用 D0 移动天气,然后使用 D0 进一步移动温度文件、D1 天气,最后移动 D1 温度文件

然而,问题是双重的。第一个障碍是,虽然我使用 Wea​​ther 获得了文件列表,但一旦我想将其复制到新目录,我就会收到错误消息,指出它无法复制该文件,因为没有这样的文件或目录。我的代码有什么问题?第二个问题是,如果我想这样做,代码效率不高,因为我必须运行代码四次(如果有两个以上的地图(D3,D4等),甚至更多。有吗?一种使代码更高效的方法,以便它可以一次完成所有工作?

解决方法

这是一个函数,它首先获取 ./Experiment 中的目录,然后将函数 fun 应用于每个目录,将它找到的文件移动到共享部分名称的子目录中。>

fun <- function(path){
  files <- list.files(path = path)
  files <- file.path(path,files)
  info <- file.info(files)
  dirs <- files[info$isdir]
  fls <- files[!info$isdir]
  out <- lapply(dirs,function(d){
    i <- grep(basename(d),fls,ignore.case = TRUE)
    if(length(i)){
      to <- file.path(d,basename(fls[i]))
      tryCatch(
        file.rename(fls[i],to = to),error = function(e) e
      )
    } else NULL
  })
  out
}

setwd('~/tmp/Experiment')
d <- list.dirs(recursive = FALSE)
sapply(d,fun)
,

以下函数检查文件名是否对应于目标目录 (GetAuthenticationStateAsync),如果不是:

  • 创建新的目标目录
  • 将文件移动到目录

该函数由 to 为每个目的地调用:

lapply