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 zipNomenclatura:
- 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
Importante:
[[ ( "$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). - 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"

Post a Comment