Avec une combinaison de bsdtar de libarchive et GNU tar , vous pouvez répertorier le contenu de ces archives imbriquées sans avoir à les extraire sur disque :
for f in *.zip; do
bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done
GNU tar peut diriger les membres des archives vers les commandes lors de l'extraction avec --to-command mais ne supporte que tar formats d'archives.
bsdtar prend en charge toutes sortes de formats d'archives à part tar ceux (dont zip ceux), n'a pas l'équivalent de GNU tar est --to-command (AFAIK), mais peut convertir les formats d'archives à la volée.
Vous ne pouvez pas le faire sans décompresser les meilleurs fichiers dans un sous-dossier.
Quelque chose comme ça :
set -e
for f in *.zip
do
n=`basename -- "${f}" .zip`
mkdir -- "${n}"
cd -- "${n}"
unzip ../"${f}"
for p in *.zip
do
unzip -l -- "${p}"
done
cd ..
rm -rf -- "${n}"
done
Vous devriez probablement vérifier si ${n} existe déjà et si c'est le cas générer une erreur. Vous pouvez également utiliser un nom de fichier temporaire pour le sous-répertoire :
dir=`mktemp -d zip-files.XXXXXX`
Ensuite, faites cd "${dir}" et rm -rf "${dir}" une fois fait.
Mises à jour :
Le set -e est utilisé pour s'assurer que si quelque chose ne va pas, le script s'arrête. Surtout, si le mkdir -- "${m}" échoue, le cd -- "${m}" échouera aussi et donc le cd .. vous amènerait au mauvais niveau de répertoire et c'est là que le rm -rf -- "${n}" devient dangereux.
Une autre façon de faire le cd .. déclaration plus sûr est de mémoriser ce répertoire avant le for bouclez et utilisez ce chemin comme suit :
topdir=`pwd`
for ...
do
...
cd "$topdir" # instead of `cd ..`
...
done
De cette façon, le rm -rf -- "${n}" ne fonctionnera qu'en $topdir .
L'utilisation du répertoire temporaire rendra également les choses beaucoup plus sûres puisque de cette façon, quels que soient les noms de fichiers dans le fichier zip supérieur, la création/suppression du répertoire fonctionnera comme prévu.
Si GNU Parallel est installé :
extract_list() {
mkdir "$1"
cd "$1"
unzip ../"$1".zip
parallel unzip -l ::: *.zip
cd ..
rm -rf "$1"
}
export -f extract_list
parallel extract_list {.} ::: *.zip