GNU/Linux >> Tutoriales Linux >  >> Linux

Bucle for anidado

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

Linux
  1. Bash For Loop Guía y ejemplos

  2. Scripts de Linux:3 procedimientos para bucles while en Bash

  3. ¿Paralelizar un Bash For Loop?

  4. Bash para ejemplos de bucle

  5. Ejecución de comandos de terminal de bucle en Jupyter

Bash Scripting – Para bucle explicado con ejemplos

Bash For Loops con ejemplos

Bash For Loop:la guía más práctica

Comprender el bucle for en los scripts de Shell

El Bash FOR Loop explicado y simplificado

Bash Script for Loop explicado con ejemplos