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

Linux下如何修改R函数以获取*.rar文件内的文件夹列表?

解决Linux下R语言处理RAR文件列表的问题

问题原因

Windows下你的函数能处理RAR是因为系统可能自带了支持RAR的解压工具,而Linux系统的unzip命令原生不支持RAR格式,R的unzip()函数底层依赖系统命令,所以无法解析RAR文件。

解决方案

需要针对RAR文件单独调用Linux系统的unrar工具来获取内容列表,同时保留原ZIP文件的处理逻辑。

第一步:安装系统依赖

先在Linux上安装unrar工具:

  • Debian/Ubuntu系:
sudo apt update && sudo apt install unrar
  • CentOS/RHEL系(需先启用EPEL源):
sudo yum install epel-release && sudo yum install unrar

第二步:修改R函数

替换原函数为以下代码(需确保已安装stringr包):

# 加载依赖包
library(stringr)
library(tools)

# 定义获取压缩包内容的辅助函数
get_archive_contents <- function(file_path) {
  file_ext <- tolower(file_ext(file_path))
  
  if (file_ext == "zip") {
    # ZIP文件沿用原unzip逻辑
    return(unzip(file_path, list = TRUE)$Name)
  } else if (file_ext == "rar") {
    # RAR文件调用unrar命令解析列表
    # 过滤unrar输出,只提取文件/文件夹路径
    cmd <- sprintf("unrar l -r '%s' | grep -v '^\\s*$' | tail -n +5 | head -n -2 | awk '{print $NF}'", file_path)
    return(system(cmd, intern = TRUE))
  } else {
    stop("不支持的压缩格式:", file_ext)
  }
}

# 批量处理压缩包
lapply(tempzip, function(x) {
  contents <- get_archive_contents(x)
  # 提取目标文件夹名称,逻辑和原函数一致
  unique(na.omit(str_extract(contents, '(?<=/).*(?=_frames/)')))
})

代码说明

  • get_archive_contents()函数会根据文件后缀自动选择处理方式:ZIP用原生unzip(),RAR调用系统unrar命令。
  • unrar l -r用于递归列出RAR内所有内容;后续的管道命令(grep/tail/head/awk)是过滤掉unrar输出的表头、空行和脚注,只保留文件路径。
  • 保留了你原有的正则提取逻辑,确保输出结果和Windows下一致。

内容的提问来源于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.18 03:10:34