如何在R语言中复制指定文件时保留原年/月/日文件夹结构?
保留层级结构批量复制文件的解决方案
你遇到的问题很典型——直接用file.copy批量复制文件时,默认不会自动创建原有的子目录结构,所以所有文件都被堆到了同一个目标文件夹里。不过我们可以通过几步简单的处理,轻松实现保留年/月/日层级的需求。
核心思路
我们需要先从每个文件的完整路径中提取相对于原始根目录的相对路径,然后在目标文件夹中创建对应的子目录,最后把文件复制到这些新建的目录里。
完整代码实现
# 请确保这里的from.dir是包含年/月/日层级的根目录(根据你的文件路径调整) from.dir <- "J:/Radar_data/Beit_Dagan/H5" to.dir <- "J:/Radar_data/Beit_Dagan/night" # night_files是你已经生成的仅包含夜间文件的向量 # 步骤1:提取每个文件相对于原始根目录的相对路径 # 这里用gsub转义路径中的斜杠,避免正则表达式出错 escaped_from_dir <- gsub("/", "\\/", from.dir) rel_paths <- sub(paste0("^", escaped_from_dir, "/"), "", night_files) # 步骤2:构建每个文件的目标完整路径 target_paths <- file.path(to.dir, rel_paths) # 步骤3:创建所有需要的子目录(年/月/日层级) # unique()避免重复创建同一个目录,showWarnings=FALSE屏蔽已存在目录的警告 lapply(unique(dirname(target_paths)), dir.create, recursive = TRUE, showWarnings = FALSE) # 步骤4:批量复制文件到对应的目标路径 # overwrite=TRUE表示如果目标文件已存在则覆盖,不需要的话可以改成FALSE mapply(file.copy, from = night_files, to = target_paths, overwrite = TRUE)
代码解释
- 提取相对路径:
sub函数会去掉每个文件路径开头的原始根目录,比如把J:/Radar_data/Beit_Dagan/H5/2018/03/10/TLV180310142554.h5转换成2018/03/10/TLV180310142554.h5。 - 构建目标路径:
file.path会自动拼接目标根目录和相对路径,生成完整的目标文件路径,比如J:/Radar_data/Beit_Dagan/night/2018/03/10/TLV180310142554.h5。 - 创建子目录:
dir.create配合recursive=TRUE可以一次性创建多级目录(比如同时创建2018、2018/03、2018/03/10),unique()避免重复创建同一个目录,减少不必要的操作。 - 批量复制:
mapply会逐个把原始文件复制到对应的目标路径,确保每个文件都放在正确的层级下。
注意事项
请确认from.dir是包含年/月/日层级的上级目录,如果你的night_files是从其他根目录获取的,需要调整这个变量到正确的路径,否则相对路径提取会出错。
内容的提问来源于stack exchange,提问作者Inbal Goldstein
相关产品推荐
相关产品推荐

