shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Como comparar as versões de dois pacotes


From: Eliphas Levy Theodoro
Subject: Re: [shell-script] Como comparar as versões de dois pacotes
Date: Mon, 20 Feb 2006 10:06:15 -0300
User-agent: Thunderbird 1.5 (Windows/20051201)

Era uma vez um empacotador rpm, que estava com esse problema.
Bom, a solução que eu adotei foi pegar os campos de trás pra frente com o sed, já que o final do arquivo é sempre consistente:

$ cat destrinchanome.sh
#!/bin/bash
while read pacote; do
novopacote=`echo "$pacote" | sed 's/\(.*\)-\(.*\)-\(.*\)\.\(.*\)\.rpm/\1@\2@\3@\4/'`
       OLDIFS="$IFS"
       IFS="@"
       set - $novopacote
       if [ "$#" -ne "4" ]; then
               echo $@
               echo "Ups, pacote $pacote nao destrinchado"
               continue
       fi
       nome=$1;versao=$2;release=$3;arch=$4
       # faz algo com o pacote
       echo $nome $versao $release $arch
done < <(ls *rpm)

$ ./destrinchanome.sh
bacula 1.38.2 1 src
cups 1.1.23 15.3 src
dhcp 3.0.2 26.FC4 i386
gocr 0.40 1 i386
hpijs 0.9.5 1.1 i386
hplip 0.9.5 1.1 i386
ntop 3.2 0 src
pine 4.63 1el src
qmail-toaster 1.03 1.2.10 src
rac 1.3 3 i386

Quanto à comparação de versões, você pode usar o "sort -n" passando todas as versões.

Se tiver rc1, rc2, etc... aí você tem que rever a lógica; se é mesmo RPM que você tá mexendo, sugiro também ver o "Epoch" e outras tags.

Depois de um tempo, surgiu uma opção (ou um programa separado? não lembro) que fazia essa comparação de versões pra mim e eu não precisei mais me preocupar com isso. Acho que é uma das funções escondidinhas do rpm.

Bom, isso já deve botar o seu script no caminho certo ':)

--
Eliphas

Hugo Doria escreveu:
Eu tenho vários pacotes aqui no formato 
nome-versão-arquitetura-release.extensao e preciso comparar as versões entre 
pacotes com mesmo nome e realizar uma açao apenas com o pacote mais recente.

A principio eu pensei em fazer algo assim para testar a versão
if [ versao-1 -gt versao-2 ]; then
comandos;
fi

Para pegar a versão dos pacotes eu usei dentro de um for: echo $i | cut -d- -f2
Mas isso não deu muito certo por dois motivos:

1) Alguns pacotes possuem strings na versão. Por exemplo: nome-1.3rc2-tal-tal.ext
2) Nem sempre o segundo campo é a versão. Em alguns pacotes o segundo campo é 
outra string. Exemplo: nome-devel-versão-tal-tal.ext


reply via email to

[Prev in Thread] Current Thread [Next in Thread]