GNU/Linux >> Linux Esercitazione >  >> Linux

Ciclo for nidificato

Con una combinazione di bsdtar di libarchive e GNU tar , puoi elencare il contenuto di quegli archivi nidificati senza doverli estrarre su disco:

for f in *.zip; do
  bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done

GNU tar può reindirizzare i membri degli archivi ai comandi dopo l'estrazione con --to-command ma supporta solo tar formati di archivio.

bsdtar supporta tutti i tipi di formati di archivio oltre a tar quelli (incluso zip quelli), non ha l'equivalente di GNU tar è --to-command (AFAIK), ma può convertire i formati di archivio al volo.


Non puoi farlo senza decomprimere effettivamente i file principali in una sottocartella.

Qualcosa del genere:

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

Probabilmente dovresti verificare se ${n} esiste già e in tal caso genera un errore. Puoi anche usare un nome file temporaneo per la sottodirectory:

dir=`mktemp -d zip-files.XXXXXX`

Quindi esegui cd "${dir}" e rm -rf "${dir}" una volta fatto.

Aggiornamenti:

Il set -e viene utilizzato per assicurarsi che se qualcosa va storto, lo script si interrompe. Soprattutto, se mkdir -- "${m}" fallisce, il cd -- "${m}" fallirà anch'esso e quindi il cd .. ti porterebbe al livello di directory sbagliato ed è lì che il rm -rf -- "${n}" diventa pericoloso.

Un altro modo per creare il cd .. un'istruzione più sicura è memorizzare quella directory prima del for loop e usa quel percorso in questo modo:

topdir=`pwd`
for ...
do
  ...
  cd "$topdir"   # instead of `cd ..`
  ...
done

In questo modo il rm -rf -- "${n}" funzionerà solo in $topdir .

L'uso della directory temporanea renderà anche le cose molto più sicure poiché in questo modo, qualunque sia il nome del file nel file zip superiore, la creazione/rimozione della directory funzionerà come previsto.


Se GNU Parallel è installato:

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 Guida ed esempi

  2. Scripting Linux:3 istruzioni per i cicli while in Bash

  3. Come configurare virt-manager per il supporto della virtualizzazione nidificata?

  4. For Loop con nomi di file?

  5. Esempi di Bash For Loop e While Loop

Bash Scripting – For Loop spiegato con esempi

Bash For Loops con esempi

Bash For Loop – La guida più pratica

Comprendere il ciclo for negli script della shell

Il ciclo Bash FOR spiegato e semplificato

Script Bash per Loop spiegato con esempi