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