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