GNU/Linux >> Tutoriels Linux >  >> Linux

Boucle for imbriquée

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

Linux
  1. Bash For Loop Guide et exemples

  2. Script Linux :3 tutoriels pour les boucles while dans Bash

  3. Conseil de pro :Boucles For, While et Until

  4. Comment configurer virt-manager pour la prise en charge de la virtualisation imbriquée ?

  5. Bash for loop Exemples

Bash Scripting - Boucle For expliquée avec des exemples

Bash For Loops avec des exemples

Bash For Loop – Le guide le plus pratique

Comprendre la boucle for dans les scripts shell

La boucle Bash FOR expliquée et simplifiée

Script bash pour la boucle expliqué avec des exemples