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