Con una combinación de bsdtar de libarchive y GNU tar , puede enumerar el contenido de esos archivos anidados sin tener que extraerlos en el disco:
for f in *.zip; do
bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done
GNU tar puede canalizar miembros de archivos a comandos al extraerlos con --to-command pero solo admite tar formatos de archivo.
bsdtar admite todo tipo de formatos de archivo además de tar unos (incluyendo zip ones), no tiene el equivalente de GNU tar de --to-command (AFAIK), pero puede convertir formatos de archivo sobre la marcha.
No puede hacerlo sin descomprimir los archivos superiores en una subcarpeta.
Algo como esto:
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
Probablemente debería verificar si ${n} ya existe y si es así genera un error. También podría usar un nombre de archivo temporal para el subdirectorio:
dir=`mktemp -d zip-files.XXXXXX`
Luego haz cd "${dir}" y rm -rf "${dir}" una vez hecho.
Actualizaciones:
El set -e se usa para asegurarse de que si algo sale mal, el script se detiene. Especialmente, si el mkdir -- "${m}" falla, el cd -- "${m}" fallará también y por lo tanto el cd .. lo llevaría al nivel de directorio incorrecto y ahí es donde el rm -rf -- "${n}" se vuelve peligroso.
Otra forma de hacer el cd .. declaración más segura es memorizar ese directorio antes del for bucle y usa esa ruta así:
topdir=`pwd`
for ...
do
...
cd "$topdir" # instead of `cd ..`
...
done
De esa manera el rm -rf -- "${n}" solo operará en $topdir .
El uso del directorio temporal también hará que las cosas sean mucho más seguras, ya que de esa manera, independientemente de los nombres de archivo en el archivo zip superior, la creación/eliminación del directorio funcionará como se esperaba.
Si GNU Parallel está instalado:
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