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