R语言批量删除多文件夹下匹配模式子文件夹的问题排查
问题说明
需要实现的需求为:删除多个文件夹内,所有匹配指定模式列表c('*_003','*_007','*_011','*_012')的子文件夹。原有自定义函数运行后无任何效果,原代码如下:
myfunction <- function(folders_list) { for(dir in Sys.glob(folders_list)) { files.to.keep <- c('*_003','*_007','*_011','*_012') files.in.dir <- list.files(pattern = paste0(files.to.keep), recursive = TRUE) files.to.remove <- list(files.in.dir[!(files.in.dir %in% grep(paste(files.to.keep,collapse = "|"), files.in.dir, value=TRUE))]) do.call(unlink, files.to.remove) }} myfunction('C:/Users/Users/myfolder/project/report_201*/')
失效原因
原代码存在多处逻辑和参数错误:
- 核心逻辑写反:需求是删除匹配指定模式的内容,原代码反向筛选了不匹配这些模式的内容作为删除目标,和需求完全相悖
- 路径读取错误:循环遍历每个父文件夹时,没有指定
list.files的查询路径为当前循环到的目录,也没有开启全路径返回,实际读取的是R当前工作目录下的文件,根本没有访问到目标路径下的内容 - 参数用法错误:
list.files的pattern参数仅支持传入单个正则字符串,直接传入多元素向量只会生效第一个值;unlink删除非空文件夹必须加recursive = TRUE参数,否则无法完成目录删除 - 匹配规则错误:glob语法的通配符
*不能直接用于正则匹配,直接拼接|生成的正则存在语法问题,匹配结果完全不符合预期
修正后代码
使用Sys.glob直接匹配glob通配符规则,不需要额外转义,逻辑更简单,同时增加了路径合法性校验:
myfunction <- function(folders_list, del_patterns = c('*_003','*_007','*_011','*_012')) { # 遍历所有匹配到的父文件夹路径 for(parent_dir in Sys.glob(folders_list)) { # 跳过不存在/不是目录的无效路径 if(!dir.exists(parent_dir)) next # 拼接父路径和删除模式,匹配所有符合规则的目标 del_targets <- unlist(lapply(del_patterns, function(p){ Sys.glob(file.path(parent_dir, p)) })) # 若需要严格仅删除文件夹、保留同名文件,取消下一行注释即可 # del_targets <- del_targets[file.info(del_targets)$isdir] # 正式执行删除前建议先打印目标列表确认,避免误删 # print(del_targets) # 递归删除匹配到的目标,force参数跳过权限提示 unlink(del_targets, recursive = TRUE, force = TRUE) } } # 函数调用 myfunction('C:/Users/Users/myfolder/project/report_201*/')
操作提示:第一次运行建议先注释
unlink行,打开print(del_targets)的注释,确认打印出来的待删除路径完全符合预期后,再执行删除操作,避免误删重要文件。
内容的提问来源于stack exchange,提问作者wanderzen
相关产品推荐
相关产品推荐

