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

