所以我想根据文件名称中的某个部分将文件复制到特定的文件夹中。为了您的概述,我把我的文件夹结构放在下面。在文件夹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来移动Weather,然后使用D0进一步移动Temperature文件、D1 Weather,最后是D1 Temperature。
然而,问题是双重的。第一个障碍是,尽管我通过Weather获得了一个文件列表,但一旦我想将其复制到新目录,我就会收到一个错误,说它无法复制文件,因为没有这样的文件或目录。我的代码出了什么问题?第二个问题是,如果我想这样做,代码的效率就不那么高了,因为我必须运行代码四次(如果有两个以上的映射(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)
以下函数检查文件名是否对应于目标目录(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')