GNU/Linux >> Znalost Linux >  >> Linux

Vnořená smyčka for

S kombinací bsdtar knihovny libarchive a GNU tar , můžete vypsat obsah těchto vnořených archivů, aniž byste je museli extrahovat na disk:

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

GNU tar může propojit členy archivů do příkazů po extrakci pomocí --to-command ale podporuje pouze tar archivní formáty.

bsdtar podporuje všechny druhy archivních formátů kromě tar jedničky (včetně zip jedničky), nemá ekvivalent GNU tar 's --to-command (AFAIK), ale dokáže převádět archivní formáty za běhu.


Nemůžete to udělat, aniž byste skutečně rozbalili horní soubory v podsložce.

Něco takového:

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

Pravděpodobně byste měli ověřit, zda ${n} již existuje a pokud ano, vygeneruje chybu. Můžete také použít dočasný název souboru pro podadresář:

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

Poté proveďte cd "${dir}" a rm -rf "${dir}" jednou hotovo.

Aktualizace:

set -e se používá k zajištění toho, že pokud se něco pokazí, skript se zastaví. Zvláště pokud mkdir -- "${m}" selže, cd -- "${m}" selže také a tedy cd .. by vás dostal na špatnou úroveň adresáře a tam je rm -rf -- "${n}" se stává nebezpečným.

Další způsob, jak vytvořit cd .. bezpečnější je zapamatovat si tento adresář před for smyčku a použijte tuto cestu takto:

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

Tímto způsobem rm -rf -- "${n}" bude fungovat pouze v $topdir .

Použití dočasného adresáře také učiní věci mnohem bezpečnějšími, protože bez ohledu na názvy souborů v horním souboru zip bude vytvoření/odstranění adresáře fungovat podle očekávání.


Pokud je nainstalováno GNU Parallel:

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. Skriptování v Linuxu:3 postupy pro smyčky while v Bash

  2. Tip pro profesionály:Smyčky For, While a Until

  3. Jak nakonfigurovat virt-manager pro podporu vnořené virtualizace?

  1. Bash pro průvodce smyčkou a příklady

  2. Paralelizovat Bash For Loop?

  3. Příklady Bash for Loop a While Loop

  1. Pro smyčku s názvy souborů?

  2. Bash for smyčky Příklady

  3. Spouštění pro příkazy terminálu smyčky v Jupyteru