web-dev-qa-db-ja.com

さまざまなパスワードと圧縮形式で多くのファイルを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

一時的に修正するには、パスワードごとにループを作成する必要がありました。

私が欲しいのは、スクリプトがパスワードと一致する場合、スクリプトは他のスクリプトをテストせず、正常に解凍しようとするパスワードと一致しない場合(パスワードがない場合)、またはエラーが表示されることです(ファイルにパスワードが含まれているが、変数に含まれていない場合)他のファイルの解凍を停止せずに。 Thk

PD:解凍するファイルには、スペースやその他の非ASCII文字を含む名前が付いている場合や、部分的に圧縮されたファイルである場合があることに注意してください。

2
ajcg

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はデフォルトで有効になっていないシェルオプションを有効にし、shopt -uはオプションを無効にします。

  • extglobさまざまなファイル拡張子に一致するように*.@(Zip|7z|rar)を実行できる機能。これは*.Zip*.7z*.rarに展開され、その特定の拡張子(ファイルがある場合)で終わるディレクトリ内のすべてのファイルに展開されますが、順序はわかりません。

  • nullglobパターンで終わるファイルがない場合*.@(Zip|7z|rar)何も評価されないため、空になります。有効にしない場合、globはliteral*.rarに展開されます。または*.7zまたは*.Zip。これによりスクリプトにエラーが発生します。

編集:OPの@ajcgに従って、期待どおりに機能するように継続ブレークを変更しました。

2
Jetchisel