Eu tenho esse script bash para descompactar arquivos com senhas diferentes. Mas descompacta indefinidamente e danifica os arquivos descompactados
PASS="passfoo passbar passfoobar"
LIST=$(ls -1 *.{zip,7z,7z.001,rar})
for password in $PASS; do
OIFS="$IFS"
IFS=$'\n'
for i in $LIST
do
echo "$password"
7z x -y -p"$password" "$i" -aoa
if [ $? -eq 0 ]; then
continue
fi
done
IFS="$OIFS"
done
Para corrigi-lo temporariamente, tive que criar um loop para cada senha.
O que eu quero é que quando o script der match com uma senha, o script não teste as demais, e se não der match com alguma senha que tente descompactar normalmente (caso não tenha senha) ou que dê um erro (se o arquivo tiver senha mas não estiver na variável) sem parar para descompactar os demais arquivos. Obrigado
PD: Lembre-se de que os arquivos para descompactar às vezes vêm com nomes com espaço e outros caracteres não ASCII ou são arquivos compactados por partes
Não tenho certeza se
continue
é a ação correta dentro do loop interno, mas ajustei seu código para isso.o
shopt -s
habilita as opções de shell que não estão habilitadas por padrão,shopt -u
para desabilitar as opções.extglob
um recurso que permite que você faça a*.@(zip|7z|rar)
correspondência de diferentes extensões de arquivo. que se expande para*.zip
*.7z
e*.rar
e se expande para todos os arquivos no diretório que termina nessa extensão específica (se houver arquivos), mas não tenho certeza sobre a ordem.nullglob
Se não houver arquivos terminando no padrão*.@(zip|7z|rar)
, nada será avaliado, portanto, ficará vazio, se não estiver ativado, o glob será expandido para um literal*.rar
ou*.7z
ou*.zip
o que causará um erro no seu script.Editar: de acordo com o @ajcg do OP, alterei o continue para quebrar, para que funcione conforme o esperado.