改进多分段RAR压缩包处理脚本:仅成功提取后删除源文件
改进RAR解压脚本:仅成功解压后删除源文件
这个问题的核心是没有正确判断解压操作的执行状态,导致不管成功失败都删除了压缩包。我们可以通过「捕获解压命令的退出码」+「精准匹配关联分段文件」来解决这个问题,下面是具体的实现方案:
核心思路
- 识别每个分段RAR的主文件(比如
xxx.part1.rar或xxx.rar,这类是解压工具默认的入口文件) - 执行解压命令,通过命令的退出状态码判断是否成功(通常
0代表成功,非0代表失败) - 仅当解压成功时,删除该主文件对应的所有分段压缩包;失败则保留源文件并记录错误
具体脚本实现(以Bash为例)
假设你用unrar工具(如果用7z只需替换解压命令即可),脚本如下:
#!/bin/bash # 错误日志文件,记录解压失败的文件信息 ERROR_LOG="extract_errors.log" # 清空旧日志(可选,根据需求调整) > "$ERROR_LOG" # 遍历所有RAR主文件:匹配.part1.rar结尾的分段主文件,以及普通.rar文件 find . -type f \( -name "*.part1.rar" -o -name "*.rar" \) | while read -r rar_main; do # 获取文件所在目录和前缀,用于匹配所有关联分段文件 file_dir=$(dirname "$rar_main") file_base=$(basename "$rar_main") # 根据主文件命名格式,匹配对应的分段文件 if [[ "$file_base" == *.part1.rar ]]; then # 格式:xxx.part1.rar → 匹配xxx.part*.rar related_pattern="${file_base%.part1.rar}.part*.rar" else # 格式:xxx.rar → 匹配xxx.r*(比如xxx.r00、xxx.r01)和xxx.part*.rar related_pattern="${file_base%.rar}.*" fi related_files="$file_dir/$related_pattern" echo "===== 开始处理:$rar_main =====" # 执行解压:-y参数自动覆盖已存在文件,解压到当前文件夹 unrar x -y "$rar_main" "$file_dir/" # 检查解压是否成功($?是上一条命令的退出码) if [[ $? -eq 0 ]]; then echo "✅ 解压成功,删除关联压缩包..." # 用echo测试删除操作(正式运行前先验证,没问题再去掉echo) # echo rm -f $related_files rm -f $related_files echo "✅ 已删除所有关联文件:$related_files" else echo "❌ 解压失败,保留源文件" # 记录错误到日志 echo "$(date +"%Y-%m-%d %H:%M:%S") 解压失败:$rar_main" >> "$ERROR_LOG" fi done echo "===== 处理完成 =====" echo "失败记录已保存到:$ERROR_LOG"
关键细节说明
- 退出码判断:
unrar和7z这类工具都会返回标准的退出码,0表示操作完全成功,非0则代表存在错误(比如分段损坏、文件缺失) - 分段文件匹配:针对两种常见的分段RAR命名格式(
.partN.rar和.rNN)做了适配,确保只删除当前主文件对应的分段包,不会误删其他无关RAR - 安全测试:脚本里留了
echo rm -f的注释,正式运行前可以先执行带echo的版本,确认要删除的文件是正确的,避免误删 - 错误日志:自动记录解压失败的文件和时间,方便后续排查损坏的压缩包
替换为7z工具的修改
如果你习惯用7z,只需把解压命令替换成:
7z x "$rar_main" -o"$file_dir" -y
7z的退出码规则和unrar一致,0代表成功。
额外建议
- 先在测试文件夹运行脚本,确认逻辑没问题再批量处理
- 对于重要文件,建议先做备份再执行删除操作
- 如果遇到特殊命名的分段包,可以调整
related_pattern的匹配规则来适配
内容的提问来源于stack exchange,提问作者user611811
相关产品推荐
相关产品推荐

