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
相关产品推荐
相关产品推荐

