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

如何编写Bash脚本递归解压嵌套zip/rar/7z文件并保留目录结构

问题原因

你的原有脚本未指定解压输出路径,unzip默认会将内容解压到脚本执行时的工作目录,而非压缩包所在的目录,就会出现目录结构错乱的问题。

前置依赖

需提前安装对应格式的解压工具:

  • Debian/Ubuntu 系列执行:sudo apt install unzip unrar p7zip-full
  • CentOS/RHEL 系列执行:sudo yum install unzip unrar p7zip-plugins
可用脚本
#!/bin/bash
# 支持的压缩格式后缀
EXTS=("zip" "rar" "7z")

while true; do
    FOUND=0
    for EXT in "${EXTS[@]}"; do
        find . -type f -name "*.$EXT" | while read -r FILE; do
            FOUND=1
            # 获取压缩包所在的目录
            DIR=$(dirname -- "$FILE")
            # 按格式对应解压,输出到压缩包所在目录
            case "$EXT" in
                zip)
                    unzip -o -q -d "$DIR" -- "$FILE"
                    ;;
                rar)
                    unrar x -o+ -y -inul -- "$FILE" "$DIR/"
                    ;;
                7z)
                    7z x -y -bso0 -o"$DIR" -- "$FILE"
                    ;;
            esac
            # 解压成功后才删除原压缩包
            if [ $? -eq 0 ]; then
                rm -f -- "$FILE"
            fi
        done
    done
    # 没有找到新的压缩包就退出循环
    [ $FOUND -eq 0 ] && break
done
参数说明
  • -o/-o+/-y:覆盖已存在的同名文件,无需手动确认
  • -q/-inul/-bso0:静默输出,不打印解压日志,不需要可以删掉对应参数
  • 脚本会循环处理直到所有层级的zip/rar/7z文件都被解压,自动保留原有目录结构,所有解压内容都会放在对应压缩包所在的目录下
注意事项
  • 请将脚本放在需要处理的父文件夹根目录下执行,也可将find命令中的.替换为目标文件夹的绝对路径
  • 若压缩包存在加密,需自行在对应解压命令中添加密码参数(如unzip加-P 密码、unrar加-p密码)
  • 建议执行前先备份原始数据,避免解压异常导致文件损失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:54:04