異なるパスワードでファイルを解凍するためのこの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文字を含む名前が付いている場合や、部分的に圧縮されたファイルである場合があることに注意してください。
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に従って、期待どおりに機能するように継続ブレークを変更しました。