0

我有一个问题,如何根据部分文件名创建一个新文件夹,并将相应的文件直接移动到新文件夹中。下面您将通过一些示例找到我的目录结构。在 D0 和 D1 文件夹中,您将找到包含 .TIF 文件的 Weather 和 Day 文件夹。我想要的是在明场和 FITC 文件夹中创建部分基于文件名的文件夹。例如,如果文件包含 s2,则使用名称中包含 S2 的文件创建文件夹 S2。

目前的情况

main Directory
    |
    |___ Experiment
            ├── D0
               ├── Weather
                       |__ D0_PM_flow__Weather 100 - CAM_s3_t5.TIF
                       |__ D0_PM_flow__Weather 100 - CAM_s3_t5.TIF
                       
            │  └── Temperature
               
            └── D1
               ├── Weather
               └── Temperature

我想要什么:

main Directory
        |
        |___ Experiment
                ├── D0
                   ├── Weather
                           |__ S1
                                | D0_PM_flow__Weather 100.txt
                           |__ S2
                                |D0_PM_flow__Weather 100.txt
                           
                │  └── Temperature
                   
                └── D1
                   ├── Weather
                   └── Temperature

我可以使用下面的代码手动执行此操作,但这需要很多时间。有没有更方便的方法可以更自动地做到这一点?为方便起见,我只在 D0/Weather 文件夹中显示了 3 个文件,但在 D0/Temperature 文件夹、D1/Weather 和 D1/Temperature 中也有文件,我还想在其中创建文件夹,例如 S1、S2 等。此外,有些文件夹只有三个组,所以 S1-S3,而其他组有 S1-S6。提前感谢您的建议

4

1 回答 1

1

回收一些代码

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

move.file <- function(filename) {
  (fromdir <- dirname(filename))
  (filebase <- basename(filename))
  dir.match <- toupper(str_extract(filename,'_[Ss][0-9]+_'))
  if (isTRUE(nchar(dir.match)>0)) {
    dir.match <- substr(dir.match,2,nchar(dir.match)-1)
    # File not in right directory
    if (basename(fromdir)!=dir.match) {
      dir.create(file.path(path,fromdir,dir.match),showWarnings = F)
      file.rename(from = file.path(path,filename),
                  to = file.path(path,fromdir,dir.match,filebase))
    }
  }  else {F}
}

lapply(files, move.file)
于 2021-04-18T19:14:43.950 回答