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

如何使用Bash命令递归解压目录下所有多格式压缩文件

问题根因

你当前的命令存在3个核心问题,导致无法完成全量递归解压:

  • find 命令仅在执行初始时刻扫描当前目录下的zip文件,外层压缩包解压后新生成的内层压缩文件不会被自动纳入扫描范围
  • 命令参数书写错误:unzip 的 -o(覆盖已有文件)和 -d(指定输出目录)参数之间缺少空格,dirname 的引号嵌套逻辑错误,会导致路径解析失败
  • 仅匹配了.zip后缀的文件,没有覆盖你提到的.gz、.bz2等其他压缩格式
调整后可落地的实现方案

通过循环扫描的逻辑,重复遍历目录下所有符合格式的压缩文件,直到不存在未处理的压缩包为止,同时修正路径解析问题、覆盖所有你提到的通用压缩格式:

#!/bin/bash
while true; do
    # 查找当前目录下所有支持格式的压缩文件
    compress_files=$(find . -type f \( -name "*.zip" -o -name "*.gz" -o -name "*.bz2" \) 2>/dev/null)
    # 无待解压文件时退出循环
    if [ -z "$compress_files" ]; then
        break
    fi
    echo "$compress_files" | while read -r file; do
        file_dir=$(dirname "$file")
        case "$file" in
            *.zip)
                unzip -o -d "$file_dir" "$file" && rm -f "$file"
                ;;
            *.gz)
                gunzip -f "$file"
                ;;
            *.bz2)
                bunzip2 -f "$file"
                ;;
            # 若.cmpr为自定义压缩格式,可在下方补充对应解压命令
            # *.cmpr)
            #     你的cmpr解压命令 输出路径"$file_dir" "$file" && rm -f "$file"
            #     ;;
        esac
    done
done

说明:上述脚本默认解压完成后删除原压缩包,避免重复扫描解压。如果需要保留原始压缩文件,删除对应分支的rm -f "$file"语句,同时给gunzip、bunzip2命令加上-k参数即可。保留原压缩包的场景下,建议将所有解压输出路径指向单独的新目录,避免触发无限循环解压。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:16:00