Header Ads

Descompresión masiva

Descomprimir un archivo en Linux es relativamente sencillo, pero supongamos que queremos descomprimir muchos archivos al mismo tiempo, con diferentes formatos de compresión (.rar, .zip, .7z, etc) y para ponerlo más complicado, algunos tienen contraseña.
Pues bien, el siguiente script en bash hace precisamente esto. Solo dele permisos de ejecución:
#!/usr/bin/env bash

shopt -s extglob nullglob nocaseglob

passw=(
  passfoo
  passbar
  passfoobar
  banana
  chocolate
  whiskey
  vodka
  icecream
)

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,
Con la tecnología de Blogger.