如何用R脚本将文件批量重命名为CSV中ID列的名称
批量重命名下载文件的R脚本实现
我通过R脚本从包含下载链接的CSV文件批量下载文件,但下载后的文件名默认取自CSV中external列的末尾部分(比如示例中的12345_download),而我需要将这些文件重命名为对应行的ID列名称(比如ABC_101)。由于涉及超过1000个文件,需要编写脚本自动匹配对应关系并完成重命名。
数据示例
| ID | external |
|---|---|
| ABC_101 | https://peaches.com/12345_download |
| ABC_102 | https://peaches.com/123456_download |
完整实现脚本
基于你已编写的代码,补充完成重命名逻辑的完整脚本如下:
library(dplyr) library(stringdist) library(writexl) library(purrr) # 设置项目工作目录 setwd("/home2/peach/") # 获取下载文件夹中所有jpg文件的完整路径 file_names <- list.files(path = "peaches_downloads/downloads/", all.files = TRUE, full.names = TRUE, recursive = TRUE, pattern = ".jpg") %>% data.frame(paths = .) # 提取文件名中用于匹配的核心标识(去掉路径、.jpg后缀和_download标识) file_names <- file_names %>% mutate( match.name = basename(paths) %>% gsub(pattern = "\\.jpg.*", replacement = "") %>% gsub(pattern = "_download", replacement = "") ) # 读取包含ID与对应链接的CSV文件 name_data <- read.csv("peaches_downloads/xlsx/fruit_full_dump_.csv") # 从external列提取用于匹配的核心标识,与文件的match.name对应 name_data <- name_data %>% mutate( external_match = basename(external) %>% gsub(pattern = "_download", replacement = "") ) # 合并文件路径与对应ID,生成重命名映射表 rename_mapping <- file_names %>% left_join(name_data %>% select(ID, external_match), by = c("match.name" = "external_match")) # 检查是否存在匹配失败的文件 missing_matches <- rename_mapping %>% filter(is.na(ID)) if(nrow(missing_matches) > 0) { cat("以下文件未找到对应ID,跳过重命名:\n") print(missing_matches$paths) } # 对匹配成功的文件执行批量重命名 rename_mapping %>% filter(!is.na(ID)) %>% rowwise() %>% mutate( new_path = file.path(dirname(paths), paste0(ID, ".jpg")) ) %>% ungroup() %>% walk(~ file.rename(from = .x$paths, to = .x$new_path)) cat("重命名操作完成!")
关键步骤说明
- 提取匹配标识:分别从文件路径和CSV的
external链接中剥离出核心匹配字段(如示例中的12345),确保两者可以精准对应。 - 生成映射表:通过
left_join将文件路径与目标ID关联,形成清晰的重命名对应关系。 - 前置校验:提前排查匹配失败的文件,避免无效操作或错误覆盖。
- 批量重命名:使用
purrr::walk遍历映射表,调用file.rename完成重命名,同时保留原文件的目录结构。
内容的提问来源于stack exchange,提问作者blamchin
相关产品推荐
相关产品推荐

