パスワードで保護されたファイルを解凍するスクリプトを作成しようとしています。パスワードは解凍時に取得するファイルの名前です
例えば。
file1.Zip contains file2.Zip and it's password is file2.
file2.Zip contains file3.Zip and it's password is file3
解凍する方法file1.Zip
、file2.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
どうすればループさせることができますか?
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シェルスクリプトで使用するためのものです。
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"
}