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

改进多分段RAR压缩包处理脚本:仅成功提取后删除源文件

改进RAR解压脚本:仅成功解压后删除源文件

这个问题的核心是没有正确判断解压操作的执行状态,导致不管成功失败都删除了压缩包。我们可以通过「捕获解压命令的退出码」+「精准匹配关联分段文件」来解决这个问题,下面是具体的实现方案:

核心思路

  1. 识别每个分段RAR的主文件(比如xxx.part1.rar或xxx.rar,这类是解压工具默认的入口文件)
  2. 执行解压命令,通过命令的退出状态码判断是否成功(通常0代表成功,非0代表失败)
  3. 仅当解压成功时,删除该主文件对应的所有分段压缩包;失败则保留源文件并记录错误

具体脚本实现(以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"

关键细节说明

  1. 退出码判断:unrar和7z这类工具都会返回标准的退出码,0表示操作完全成功,非0则代表存在错误(比如分段损坏、文件缺失)
  2. 分段文件匹配:针对两种常见的分段RAR命名格式(.partN.rar和.rNN)做了适配,确保只删除当前主文件对应的分段包,不会误删其他无关RAR
  3. 安全测试:脚本里留了echo rm -f的注释,正式运行前可以先执行带echo的版本,确认要删除的文件是正确的,避免误删
  4. 错误日志:自动记录解压失败的文件和时间,方便后续排查损坏的压缩包

替换为7z工具的修改

如果你习惯用7z,只需把解压命令替换成:

7z x "$rar_main" -o"$file_dir" -y

7z的退出码规则和unrar一致,0代表成功。

额外建议

  • 先在测试文件夹运行脚本,确认逻辑没问题再批量处理
  • 对于重要文件,建议先做备份再执行删除操作
  • 如果遇到特殊命名的分段包,可以调整related_pattern的匹配规则来适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:30:19