Se non hai e non puoi installare zipinfo
per qualsiasi motivo, puoi imitarlo usando unzip
con -Z
opzione. Per elencare il contenuto del codice postale usa unzip -Z1
:
pw="$(unzip -Z1 file1.zip | cut -f1 -d'.')"
unzip -P "$pw" file1.zip
Mettilo in loop:
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
o una funzione ricorsiva:
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 modalità zipinfo(1). Se la prima opzione sulla riga di comando è -Z, le restanti opzioni vengono prese come opzioni zipinfo(1). Vedere la pagina di manuale appropriata per una descrizione di queste opzioni.
-1 :elenca solo i nomi dei file, uno per riga. Questa opzione esclude tutte le altre; intestazioni, trailer e commenti di file zip non vengono mai stampati. È inteso per l'uso negli script della shell Unix.
Chiedi zipinfo
per il nome file elencato nel file zip, quindi acquisiscilo per la password. Usa quella password per decomprimere il file:
pw=$(zipinfo -1 file1.zip | cut -d. -f1)
unzip -P "$pw" file1.zip
Nota che il flag a zipinfo
è uno non un ell .
Prendendo liberamente in prestito dalla risposta di Gilles a una domanda simile, ecco un ciclo bash che estrarrà un file zip nidificato protetto da password fino a quando non ci saranno più file zip:
shopt -s nullglob
while set -- *.zip; [ $# -eq 1 ]
do
unzippw "$1" && rm -- "$1"
done
Dove ho definito la funzione unzippw
come involucro per il zipinfo
e unzip
comandi sopra:
unzippw ()
{
local pw=$(zipinfo -1 "$1" | cut -d. -f1)
unzip -P "$pw" "$1"
}