根据文件名创建文件夹

Create folder based on filename

我有一个问题,如何根据部分文件名创建一个新文件夹,并将相应的文件直接移动到新文件夹中。您将在下面找到我的目录结构和一些示例。在 D0 和 D1 文件夹中,您会发现包含 .TIF 文件的天气和日期文件夹。我想要的是在 brightfield 和 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。 预先感谢您的建议

回收:

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)