
パスワードで保護されたファイルを解凍するためのスクリプトを作成しようとしています。パスワードは、解凍したときに取得したファイルの名前です。
例えば。
- file1.zipには、パスワードがfile2のfile2.zipが含まれています。
- file2.zipにはfile3.zipが含まれており、パスワードはfile3です。
file1.zip
解凍して名前を読んでfile2.zip
スクリプトに入力するにはどうすればよいですか?
以下はコマンドラインのスクリーンショットです。
root@kaliVM:~/Desktop# unzip 49805.zip Archive: 49805.zip [49805.zip] 13811.zip password:
新しいパスワードを知るためにこの出力を読み取るには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
今、どのようにループにすることができますか?
答え1
そのエントリがなく、zipinfo
何らかの理由でインストールできない場合は、unzip
withオプションを使用して-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シェルスクリプトで使用するように設計されています。
答え2
尋ねるzipinfo
zipファイルにリストされているファイル名を取得し、パスワードでキャプチャします。ファイルを解凍するには、次のパスワードを使用してください。
pw=$(zipinfo -1 file1.zip | cut -d. -f1)
unzip -P "$pw" file1.zip
フラグは次のとおりですzipinfo
。一つ一つでもないエルザ。
ゆったりとお金を借りる同様の質問に対するGilesの答え以下は、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"
}