R语言如何根据数据框文件名列表高效批量移动指定文件到目标文件夹
R语言基于数据框文件名批量移动文件的高效方案
你之前的方案低效核心有两个原因:一是没必要手动复制dput输出的文件名,直接调用数据框的filename列即可完全绕开手动处理的瓶颈;二是如果你的需求是移动文件而非复制原文件,file.copy需要读写两次磁盘,速度远低于直接修改文件系统索引的移动操作。
原生R实现(无需额外依赖)
直接用R内置函数即可完成万级文件的秒级批量处理:
# 替换为你自己的实际路径,优先用绝对路径避免路径错误 source_dir <- "local/dir/where/all/files/are/present" target_dir <- "Final/Final" # 自动创建不存在的目标目录,递归创建多层目录 if (!dir.exists(target_dir)) dir.create(target_dir, recursive = TRUE) # 直接从数据框提取文件名,拼接完整源路径,不需要手动复制任何内容 file_full_paths <- file.path(source_dir, df$filename) # 过滤实际存在的文件,避免后续操作报错 valid_file_index <- file.exists(file_full_paths) valid_source_paths <- file_full_paths[valid_file_index] valid_target_paths <- file.path(target_dir, df$filename[valid_file_index]) # 移动文件,仅修改文件系统索引,无需重写磁盘,速度远快于复制 move_stats <- file.rename(from = valid_source_paths, to = valid_target_paths) # 可选:查看移动结果 cat("成功移动文件数:", sum(move_stats), "\n") cat("移动失败文件数:", sum(!move_stats), "\n") if (sum(!move_stats) > 0) { cat("移动失败的文件列表:\n") print(df$filename[!move_stats]) }
如果你的需求确实是保留原文件只做复制,把file.rename换成file.copy(from = valid_source_paths, to = valid_target_paths, copy.mode = TRUE)即可。
超大量文件优化方案(可选)
如果文件量超过10万,可使用性能更高的fs包处理,内置函数做了大量IO优化:
# 首次使用先安装包 # install.packages("fs") library(fs) source_dir <- "local/dir/where/all/files/are/present" target_dir <- "Final/Final" # 创建目标目录 dir_create(target_dir, recurse = TRUE) # 拼接路径+过滤有效文件 source_paths <- path(source_dir, df$filename) valid_paths <- source_paths[file_exists(source_paths)] target_paths <- path(target_dir, path_file(valid_paths)) # 批量移动 file_move(valid_paths, target_paths)
内容的提问来源于stack exchange,提问作者SUMIT
相关产品推荐
相关产品推荐

