如何编写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
相关产品推荐
相关产品推荐

