You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:39:20