eu executo este script, mas isso tem um problema com extrair multiparts rar
#!/usr/bin/env bash
shopt -s extglob nullglob
passw=(
passfoo
passbar
passfoobar
banana
chocolate
whiskey
vodka
icecream
)
for f in *.@(rar|zip|zip.001|7z|7z.001); do
for p in "${passw[@]}"; do
if 7z x -y -p"$p" "$f" -aoa; then
break
fi
done
done
Com .zip
ou .7z
descompacta bem as multipartes, pois a extensão das multipartes são iguais (for .7z
= 7z.001
, 7z.002
, etc. For .zip
= zip.001
, zip.002
, etc). O problema é que se eu adicionar isso ao script:
*.@(rar|part1.rar|zip|zip.001|7z|7z.001)
Ele falha porque ambos terminam em .rar*.partX.rar
e o loop descompacta a mesma coisa repetidamente ou falha em diante se o arquivo tiver senha.rar
.part2.rar
Tentativas fracassadas de corrigir o problema:
Para excluir qualquer arquivo de
.part2.rar
(exemplo:*.part{2..99}.rar
)Com o interruptor "-x"
Agradeço ajuda para completar o loop e integrar a descompactação de arquivos multipartes no .rar
formato
A primeira coisa a fazer no loop externo pode ser verificar se ele se
$f
qualifica para ser ignorado.No Bash, você pode fazer isso com
[[
, usando correspondência de padrão (com=
,==
ou!=
) ou um regex (com=~
). A última opção é mais poderosa. No seu caso, isso deve funcionar:As expressões que usei consistem nestas partes:
\.
– corresponde a um ponto literalpart
,rar
,1
– correspondem apart
,rar
e1
literalmente, respectivamente[[:digit:]]+
– corresponde a um ou mais dígitos (conforme definido pela localidade atual)0*
– corresponde a zero ou mais0
caracteres$
– corresponde ao final da string que está sendo testada!
nega.A lógica é a seguinte: se o nome do arquivo terminar com
.part<digit(s)>.rar
e não terminar com.part1.rar
(ou.part01.rar
, ou.part001.rar
etc.), então retome a próxima iteração (ou seja, pegue a próximaf
e comece de novo).Se eu fosse você, adicionaria
nocaseglob
àshopt -s …
linha, para combinar nomes comoFOO.RAR
com seu padrão (*.@(rar|zip|zip.001|7z|7z.001)
). Meus testes indicam que é o suficiente para fazer minha solução (=~
) funcionar com eles também (sem necessidade de habilitar adicionalmentenocasematch
).