问题描述
所以我想根据文件名中的某个部分将文件复制到特定文件夹。为了您的概述,我将我的文件夹结构放在下面。在文件夹 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等),甚至更多。有吗?一种使代码更高效的方法,以便它可以一次完成所有工作?
解决方法
这是一个函数,它首先获取 ./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