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
echo "Unzipping..."

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
    7z t -p"$p" "$f" &> /dev/null
    if [ $? -eq 0 ]; then
      echo "password match: $p"
      7z x -y -p"$p" "$f" -aoa &> /dev/null
      break
    else
      echo "testing password: $p"
    fi
  done
done
echo 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).
Importante:
- Si el archivo a descomprimir está dañado (error de verificación por redundancia cíclica CRC), en algunos escenarios puede generar un bucle infinito.
- Antes de ejecutar el script, tenga en cuenta que algunos archivos .rar por volúmenes no siempre terminan con la extensión .rXX (.r00, r01, etc.) ejemplo: file (1).rar, file (2).rar y el script al intentar descomprimirlos, saldrá el error "Missing volume: file (1).r00". En este caso deberá renombrar los archivos, por ejemplo: file.part1.rar, file.part2.rar, etc. Para mayor información, consulte el reporte de posible BUG
- Los archivos 7-Zip usan LZMA y LZMA2, que puede generar incompatibilidad con las herramientas estándar de Linux (tar, bzip2, xz, gzip). Para descomprimir masivamente tar.gz con 7zip, puede incluir en el script el siguiente comando:
find -maxdepth 1 -iname "*tar.gz" -print0 | xargs -0 -I {} sh -c  "7z x '{}' -so | 7z x -aoa -si -ttar"

Fuente consultada: superuser, 7z Linux, novatoz, 7zip SDK,
Con la tecnología de Blogger.