web-dev-qa-db-ja.com

Bashループのパスワード付きファイルスクリプトの解凍

パスワードで保護されたファイルを解凍するスクリプトを作成しようとしています。パスワードは解凍時に取得するファイルの名前です

例えば。

file1.Zip contains file2.Zip and it's password is file2.

file2.Zip contains file3.Zip and it's password is file3

解凍する方法file1.Zipfile2.Zipスクリプトに入力できるようにするには?

これが私が意味したもののスクリーンショットです 、新しいパスワードを知るためにその出力を読み取るためにbashが必要です(この場合、パスワードは13811です)。

これが私がこれまでに行ったことです

    #!/bin/bash

    echo First Zip name:
    read firstfile


    pw=$(zipinfo -1 $firstfile | cut -d. -f1)
    nextfile=$(zipinfo -1 $firstfile)
    unzip -P $pw $firstfile

    rm $firstfile
    nextfile=$firstfile

どうすればループさせることができますか?

6
molinskeh

zipinfoがなく、何らかの理由でインストールできない場合は、unzip-Zオプションとともに使用することで、それを模倣できます。 Zipの内容を一覧表示するには、unzip -Z1を使用します。

pw="$(unzip -Z1 file1.Zip | cut -f1 -d'.')" 
unzip -P "$pw" file1.Zip

ループに入れます:

zipfile="file1.Zip"
while unzip -Z1 "$zipfile" | head -n1 | grep "\.Zip$"; do
    next_zipfile="$(unzip -Z1 "$zipfile" | head -n1)"
    unzip -P "${next_zipfile%.*}" "$zipfile"
    zipfile="$next_zipfile"
done

または再帰関数:

unzip_all() {
    zipfile="$1"
    next_zipfile="$(unzip -Z1 "$zipfile" | head -n1)"
    if echo "$next_zipfile" | grep "\.Zip$"; then
        unzip -P "${next_zipfile%%.*}" "$zipfile"
        unzip_all "$next_zipfile"
    fi
}
unzip_all "file1.Zip"

-Z zipinfo(1)モード。コマンドラインの最初のオプションが-Zの場合、残りのオプションはzipinfo(1)オプションと見なされます。これらのオプションの説明については、適切なマニュアルページを参照してください。

-1:ファイル名のみをリストします(1行に1つ)。このオプションは他のすべてを除外します。ヘッダー、トレーラー、zipファイルのコメントは印刷されません。 Unixシェルスクリプトで使用するためのものです。

8
pLumo

zipinfo にZipファイルにリストされているファイル名を尋ね、パスワードを取得します。そのパスワードを使用してファイルを解凍します。

pw=$(zipinfo -1 file1.Zip | cut -d. -f1)
unzip -P "$pw" file1.Zip

zipinfoへのフラグはellではなくoneであることに注意してください。

同様の質問に対するGillesの回答 から自由に借用します。これは、Zipファイルがなくなるまでパスワードで保護されたネストされたZipファイルを抽出するbashループです。

shopt -s nullglob
while set -- *.Zip; [ $# -eq 1 ]
do 
  unzippw "$1" && rm -- "$1"
done

上記のunzippwおよびzipinfoコマンドのラッパーとして関数unzipを定義したところ:

unzippw ()
{
    local pw=$(zipinfo -1 "$1" | cut -d. -f1)
    unzip -P "$pw" "$1"
}
8
Jeff Schaller