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