Si vous n'avez pas et ne pouvez pas installer zipinfo
pour une raison quelconque, vous pouvez l'imiter en utilisant unzip
avec -Z
option. Pour lister le contenu du zip, utilisez unzip -Z1
:
pw="$(unzip -Z1 file1.zip | cut -f1 -d'.')"
unzip -P "$pw" file1.zip
Mettez-le dans une boucle :
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
ou une fonction récursive :
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 mode zipinfo(1). Si la première option de la ligne de commande est -Z, les options restantes sont considérées comme des options zipinfo(1). Voir la page de manuel appropriée pour une description de ces options.
-1 :ne liste que les noms de fichiers, un par ligne. Cette option exclut toutes les autres ; les en-têtes, les bandes-annonces et les commentaires des fichiers zip ne sont jamais imprimés. Il est destiné à être utilisé dans les scripts shell Unix.
Demandez zipinfo
pour le nom de fichier répertorié dans le fichier zip, puis capturez-le pour le mot de passe. Utilisez ce mot de passe pour décompresser le fichier :
pw=$(zipinfo -1 file1.zip | cut -d. -f1)
unzip -P "$pw" file1.zip
Notez que le drapeau à zipinfo
est un un pas un ell .
Empruntant généreusement à la réponse de Gilles à une question similaire, voici une boucle bash qui extraira un fichier zip imbriqué protégé par mot de passe jusqu'à ce qu'il n'y ait plus de fichiers zip :
shopt -s nullglob
while set -- *.zip; [ $# -eq 1 ]
do
unzippw "$1" && rm -- "$1"
done
Où j'ai défini la fonction unzippw
comme wrapper pour le zipinfo
et unzip
commandes ci-dessus :
unzippw ()
{
local pw=$(zipinfo -1 "$1" | cut -d. -f1)
unzip -P "$pw" "$1"
}