使用 bash 脚本解压具有不同密码和压缩格式的许多文件

使用 bash 脚本解压具有不同密码和压缩格式的许多文件

我有这个 bash 脚本,可以使用不同的密码解压文件。但它会无限解压,并损坏解压后的文件

PASS="passfoo passbar passfoobar"
LIST=$(ls -1 *.{zip,7z,7z.001,rar})
for password in $PASS; do
  OIFS="$IFS"
  IFS=$'\n'
  for i in $LIST
  do
      echo "$password"
      7z x -y -p"$password" "$i" -aoa
      if [ $? -eq 0 ]; then
     continue
    fi
   done
   IFS="$OIFS"
  done

为了暂时解决这个问题,我不得不为每个密码创建一个循环。

我想要的是当脚本匹配一个密码时,脚本不会测试其他密码,并且如果没有任何密码匹配则尝试正常解压缩(如果它没有密码)或显示错误(如果文件有密码但不在变量中)而不停止解压缩其他文件。谢谢

PD:请记住,要解压的文件有时带有空格和其他非 ASCII 字符的名称,或者是按部分压缩的文件

答案1

不确定continue内循环内的操作是否正确,但我已针对此调整了您的代码。

#!/usr/bin/env bash

shopt -s extglob nullglob

passw=(
  passfoo
  passbar
  passfoobar
  banana
  chocolate
  whiskey
  vodka
  icecream
)

for f in *.@(zip|7z|7z.001|rar); do
  for p in "${passw[@]}"; do
    if 7z x -y -p"$p" "$f" -aoa; then
      break
    fi
  done
done
  • 启用shopt -s默认情况下未启用的 shell 选项,shopt -u禁用选项。

  • extglob此功能可让您*.@(zip|7z|rar)匹配不同的文件扩展名。它扩展为*.zip *.7z*.rar扩展为目录中以该特定扩展名结尾的所有文件(如果有文件),但不确定顺序。

  • nullglob如果没有以模式结尾的文件,*.@(zip|7z|rar)则不会评估任何内容,因此它将为空,如果未启用,则 glob 将扩展为文字 *.rar*.7z*.zip将导致脚本出现错误。

编辑:根据 OP 的 @ajcg ,我已继续中断以使其按预期工作。

相关内容