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

Moving files to subdirectory in R based on file name

所以我想根据名称中的特定部分将文件复制到特定文件夹。为了您的概述,我将我的文件夹结构放在下面。在文件夹 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 温度文件。

然而,问题是双重的。第一个障碍是,虽然我得到了带有 Weather 的文件列表,但一旦我想将它复制到一个新目录,我就会收到一个错误,说它无法复制文件,因为没有这样的文件或目录。我的代码有什么问题?第二个问题是,如果我想这样做,代码效率不高,因为我必须 运行 代码四次(如果有两个以上的地图(D3、D4 等),甚至更多)。 ). 有没有办法让代码更高效,一次性搞定?

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

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

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

library(stringr)
#Get all files
path <- 'C:/temp/experiment'
files <- list.files(path= path, recursive = TRUE)

move.file <- function(filename,to = 'Brightfield') {
  fromdir <- dirname(filename)
  rootdir <- dirname(fromdir)
  filebase <- basename(filename)
  # File not in right directory
  if (str_detect(filebase, regex(to, ignore_case = TRUE))&
      !str_detect(fromdir, regex(to, ignore_case = TRUE))) {
    dir.create(file.path(rootdir,to),showWarnings = F)
    file.rename(from = file.path(path,filename),
              to = file.path(path,rootdir,to,filebase))
  } else {F}
}

lapply(files, move.file, to='Brightfield')
lapply(files, move.file, to='FITC')

这是一个函数,它首先获取 ./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)