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

如何用R提取Zip/Rar文件中的二级目录名称?

从Zip和Rar文件中提取二级目录名称

处理Zip文件

先通过unzip()获取压缩包内的文件列表,再通过字符串处理筛选出目标二级目录:

  1. 获取压缩包文件列表:
zip_list <- unzip(zipfile = "teste1.zip", list = TRUE)
  1. 筛选出所有目录(名称以/结尾):
dirs <- zip_list[grepl("/$", zip_list$Name), ]
  1. 提取二级目录名称:
    使用基础R的字符串分割方法:
# 分割路径为组件
path_parts <- strsplit(dirs$Name, "/")
# 筛选二级目录(路径分割后长度为3,例如"teste1/Nova pasta1/"分割为3个元素)
secondary_dir_idx <- sapply(path_parts, function(x) length(x) == 3)
# 提取目录名称
subdir_names <- sapply(path_parts[secondary_dir_idx], function(x) x[2])

或者用stringr包简化操作:

library(stringr)

subdir_names <- str_extract(dirs$Name, "^[^/]+/([^/]+)/$") %>%
  str_remove("^[^/]+/") %>%
  str_remove("/$") %>%
  na.omit()

执行后subdir_names会包含目标二级目录名称(如Nova pasta1)。

处理Rar文件

对于Rar文件,可使用unrar包或系统命令(需提前安装unrar工具):

方法1:使用unrar包

library(unrar)

# 获取Rar文件列表
rar_list <- unrar_list("teste1.rar")
# 筛选目录
dirs_rar <- rar_list[grepl("/$", rar_list$Name), ]
# 重复Zip文件的提取逻辑
path_parts_rar <- strsplit(dirs_rar$Name, "/")
secondary_dir_idx_rar <- sapply(path_parts_rar, function(x) length(x) == 3)
subdir_names_rar <- sapply(path_parts_rar[secondary_dir_idx_rar], function(x) x[2])

方法2:使用系统命令(需安装unrar)

# 获取Rar内的目录列表
rar_dirs <- system("unrar lb teste1.rar | grep '/$'", intern = TRUE)
# 提取二级目录名称
subdir_names_rar <- sapply(strsplit(rar_dirs, "/"), function(x) x[2])

批量处理目录下所有Zip/Rar文件

如果需要处理目录中所有压缩文件,可通过循环实现:

library(unrar)
library(stringr)

# 获取所有Zip和Rar文件
files <- list.files(pattern = "\\.(zip|rar)$", ignore.case = TRUE)

# 存储结果的列表
all_subdirs <- list()

for(file in files) {
  if(str_detect(file, "\\.zip$", negate = FALSE)) {
    # 处理Zip文件
    zip_list <- unzip(file, list = TRUE)
    dirs <- zip_list[grepl("/$", zip_list$Name), ]
    subdirs <- str_extract(dirs$Name, "^[^/]+/([^/]+)/$") %>%
      str_remove("^[^/]+/") %>%
      str_remove("/$") %>%
      na.omit()
  } else {
    # 处理Rar文件
    rar_list <- unrar_list(file)
    dirs <- rar_list[grepl("/$", rar_list$Name), ]
    subdirs <- str_extract(dirs$Name, "^[^/]+/([^/]+)/$") %>%
      str_remove("^[^/]+/") %>%
      str_remove("/$") %>%
      na.omit()
  }
  all_subdirs[[file]] <- subdirs
}

# 转换为数据框
result_df <- data.frame(
  压缩文件 = rep(names(all_subdirs), sapply(all_subdirs, length)),
  二级目录 = unlist(all_subdirs),
  stringsAsFactors = FALSE
)

内容的提问来源于stack exchange,提问作者Wilson Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:48:16