Descomprimir varios archivos al mismo tiempo con diferentes formatos

0
7402

Descomprimir un archivo en Linux es sencillo, pero que pasa si lo que queremos es descomprimir muchos archivos al mismo tiempo, con diferentes formatos de compresión (.rar, .zip, .7z, etc) y si algunos tienen contraseña.

El siguiente script en bash hace precisamente esto. Solo dele permisos de ejecución:
#!/usr/bin/env bash

shopt -s extglob nullglob nocaseglob

passw=(
  ejemplo1
  ejemplo2
  ejemplo3
  ejemplo4
  ejemplo5
  ejemplo6
  ejemplo7
  ejemplo8
)

for f in *.@(rar|zip|zip.001|7z|7z.001); do
  [[ ( "$f" =~ .part[[:digit:]]+.rar$ ) && ! ( "$f" =~ .part0*1.rar$ ) ]] && continue
  for p in "${passw[@]}"; do
    if 7z x -y -p"$p" "$f" -aoa; then
      break
    fi
  done
done
Dependencias:
p7zip-full p7zip-rar
# packages used for testing
sharutils rar unrar tar unzip zip

Nomenclatura:

La opción shopt -s habilita las opciones de shell que no están habilitadas por defecto (shopt -u para deshabilitar las opciones).
extglob una característica que le permite hacer *.@(zip|7z|rar|etc) para que coincida con diferentes extensiones de archivo, que se expande a *.zip *.7z, *.rar, etc., y a todos los archivos en el directorio que termina en esa extensión en particular (si existen).
nullglob es para evitar error del script si no hay archivos que terminen en *.@(zip|7z|rar|etc) (si no hay, no hace nada). Se recomienda agregar todos los formatos deseados (ejecute 7z i).
nocaseglob para que coincida con nombres como FOO.RAR con el patrón establecido *.@(zip|7z|rar|etc).
break interrumpe la búsqueda si hay coincidencias
La variable passw se encarga de almacenar las contraseñas. Cámbielas por las suyas.
La línea [[ ( "$f" =~ .part[[:digit:]]+.rar$ ) && ! ( "$f" =~ .part0*1.rar$ ) ]] && continue es para solucionar el problema de la descompresión de multipartes .rar (part1.rar, part2.rar, part01.rar, part001.rar etc)
Nota: Los archivos 7-Zip usan LZMA y LZMA2, que puede generar incompatibilidad con las herramientas estándar de Linux (tar, bzip2, xz, gzip)

.
Fuente consultada: superuser, 7z Linux, novatoz, 7zip SDK,

Dejar respuesta

Please enter your comment!
Please enter your name here