Discussion:
[shell-script] remoção de pacotes antigos
Rodrigo Ribeiro ribeirrs@gmail.com [shell-script]
2016-11-28 23:17:31 UTC
Permalink
Pessoal, boa noite!


Tenho uma automação que entrega os pacotes rpm de um repositório meu local
para os meus hosts.
Fiz um script que pega todos os pacotes que meus hosts estão utilizando e
faz uma lista. Nessa lista está o nome dos pacotes e o path deles como no
exemplo abaixo:


/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm




Preciso que meu script agora remova todas as versões anteriores ao que está
instalado nos meus hosts (que obtive através da lista), para isso uma
validação que ele precisa fazer é pegar o número da versão dessa lista e
tudo que for um numero inferior (versões anteriores) remover do meu
repositório, pois nesse meu cenário só preciso o que já está instalado ou
versões posteriores, pois pode ser que futuramente elas sejam autorizadas
em futuras entregas.


A primeira forma que tentei fazer isso foi o if com -lt, mas como nos nomes
dos pacotes possuem campos alfanuméricos esse método não funcionou, pois
ele reclama que há muitos argumentos.


Diante disso pensei em parsear a primeira lista para uma segunda, só com o
nome dos pacotes e os números das versões, sem campos alfanuméricos e
caracteres para grepar no meu diretório original e tomar a decisão de
apagar ou não, Tentei isso usando cut, awk, sed mas em algumas ocasiões não
deram certo pois nem sempre tem o mesmo padrão de nome, como no exemplo que
passei ai, o pacoteD tem alguns campos a mais até chegar no número da
versão.


Alguém tem uma luz de como eu poderia fazer nesse caso?
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2016-11-29 11:53:18 UTC
Permalink
1 -
$ echo "/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm"
| grep -oE -- '-[0-9.-]+'
-1.2.1-20.
-1.2.1-20.
-1.2.1-20.
-1.0.1-45-1.2.1-20.

2 -
$ echo "/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm"
| grep -oE -- '-[0-9.-]+.*'
-1.2.1-20.x86_64.rpm
-1.2.1-20.x86_64.rpm
-1.2.1-20.x86_64.rpm
-1.0.1-45-1.2.1-20.x86_64.rpm
​
Uma dica interessante: o -- é uma convenção que diz às instruções que a
partir daquele ponto não existe mais opções. A partir dali, tudo é dado, no
caso, regexp.

Para testar, experimente fazer:
$ > -xx
$ rm -i -xx
rm: opção -- 'x' inválida
Tente 'rm ./-xx' para remover o arquivo “-xx”.
Try 'rm --help' for more information.
$ rm -i -- -xx
rm: remover arquivo comum vazio “-xx”? y
$
​


Abcs,
Julio
*@juliobash*

*Próximos cursos de Shell*
*Cidade Local Período*
*​*
*São Paulo 4Linux
<https://www.4linux.com.br/curso/programacao-em-shell-script> 05-09/12*
Dou treinamento de *Shell* em qualquer cidade.
Post by Rodrigo Ribeiro ***@gmail.com [shell-script]
Pessoal, boa noite!
Tenho uma automação que entrega os pacotes rpm de um repositório meu local
para os meus hosts.
Fiz um script que pega todos os pacotes que meus hosts estão utilizando e
faz uma lista. Nessa lista está o nome dos pacotes e o path deles como no
/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-
1.2.1-20.x86_64.rpm
Preciso que meu script agora remova todas as versões anteriores ao que
está instalado nos meus hosts (que obtive através da lista), para isso uma
validação que ele precisa fazer é pegar o número da versão dessa lista e
tudo que for um numero inferior (versões anteriores) remover do meu
repositório, pois nesse meu cenário só preciso o que já está instalado ou
versões posteriores, pois pode ser que futuramente elas sejam autorizadas
em futuras entregas.
A primeira forma que tentei fazer isso foi o if com -lt, mas como nos
nomes dos pacotes possuem campos alfanuméricos esse método não funcionou,
pois ele reclama que há muitos argumentos.
Diante disso pensei em parsear a primeira lista para uma segunda, só com o
nome dos pacotes e os números das versões, sem campos alfanuméricos e
caracteres para grepar no meu diretório original e tomar a decisão de
apagar ou não, Tentei isso usando cut, awk, sed mas em algumas ocasiões não
deram certo pois nem sempre tem o mesmo padrão de nome, como no exemplo que
passei ai, o pacoteD tem alguns campos a mais até chegar no número da
versão.
Alguém tem uma luz de como eu poderia fazer nesse caso?
itamarnet@yahoo.com.br [shell-script]
2016-11-29 15:02:02 UTC
Permalink
Caro Rodrigo

Veja se essa solução lhe atende.
Aqui eu listo o nome do pacote, a arquitetura e a versão separados por tab


echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm' |
while read pacote
do
arq=$(basename $pacote)
arch=$(echo $arq | awk -F '.' '{print $(NF-1)}')
version=$(echo ${arq%.${arch}*} | grep -oE '[0-9.-]+$')
printf "%s\t%s\t%s\n" ${arq%${version}*} $arch ${version#-}
done





[]'s
Itamar
Rodrigo Ribeiro ribeirrs@gmail.com [shell-script]
2016-12-01 22:53:28 UTC
Permalink
Caros, boa noite,

Primeiramente muito obrigado pela ajuda!

Itamar,

Desse jeito que vc passou o resultado foi:


nome_pacoteA x86_64 1.2.1-20
nome_pacoteB x86_64 1.2.1-20
nome_pacoteC x86_64 1.2.1-20
nome_pacoteD-xxx-base x86_64 1.0.1-45-1.2.1-20

Preciso gerar uma lista que fique:

nome_pacoteA12120
nome_pacoteB12120
nome_pacoteC12120
nome_pacoteD-xxx-base1014512120


A forma que o Julio me passou eu até consegui tirar os caracters com o sed,
porém não consegui concatenar com o nome dos pacotes da forma que
exemplifiquei acima.
Post by ***@yahoo.com.br [shell-script]
Caro Rodrigo
Veja se essa solução lhe atende.
Aqui eu listo o nome do pacote, a arquitetura e a versão separados por tab
echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm' |
while read pacote
do
arq=$(basename $pacote)
arch=$(echo $arq | awk -F '.' '{print $(NF-1)}')
version=$(echo ${arq%.${arch}*} | grep -oE '[0-9.-]+$')
printf "%s\t%s\t%s\n" ${arq%${version}*} $arch ${version#-}
done
[]'s
Itamar
--
*Rodrigo Ribeiro*
Cel: 7984-9785
E-mail: ***@gmail.com
Twitter: @ribeirrs
itamarnet@yahoo.com.br [shell-script]
2016-12-01 23:18:33 UTC
Permalink
Certo Rodrigo

Como não havia dito antes a forma que queria sua saída apenas demos exemplos, mas é fácil adaptação para o que deseja.

echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm' |
while read pacote
do
arq=$(basename $pacote)
arch=$(echo $arq | awk -F '.' '{print $(NF-1)}')
version=$(echo ${arq%.${arch}*} | grep -oE '[0-9.-]+$')
printf "%s%s\n" ${arq%${version}*} $(echo ${version} | tr -d -c [0-9])

done


Isso ajuda?

[]'s
Itamar
Rodrigo Ribeiro ribeirrs@gmail.com [shell-script]
2016-12-02 13:18:41 UTC
Permalink
Muito obrigado Itamar! Era exatamente o que eu precisava =)
Post by ***@yahoo.com.br [shell-script]
Certo Rodrigo
Como não havia dito antes a forma que queria sua saída apenas demos
exemplos, mas é fácil adaptação para o que deseja.
echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm' |
while read pacote
do
arq=$(basename $pacote)
arch=$(echo $arq | awk -F '.' '{print $(NF-1)}')
version=$(echo ${arq%.${arch}*} | grep -oE '[0-9.-]+$')
printf "%s%s\n" ${arq%${version}*} $(echo ${version} | tr -d -c [0-9])
done
Isso ajuda?
[]'s
Itamar
--
*Rodrigo Ribeiro*
Cel: 7984-9785
E-mail: ***@gmail.com
Twitter: @ribeirrs
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2016-12-02 14:51:29 UTC
Permalink
Uns vc usou o hifen, no último não. Aí ficou meio confuso.

Deixando o hífen em todos:

$ echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm'
| sed -r 's|^.*/(.*)\.x.*$|\1|'
nome_pacoteA-1.2.1-20
nome_pacoteB-1.2.1-20
nome_pacoteC-1.2.1-20
nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20

Tirando o hífen de todos:

$ echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm'
| sed -r 's|^.*/([^-]+)-(.*)\.x.*$|\1\2|'
nome_pacoteA1.2.1-20
nome_pacoteB1.2.1-20
nome_pacoteC1.2.1-20
nome_pacoteDxxx-base-1.0.1-45-1.2.1-20

Abcs,
Julio
*@juliobash*

*Próximos cursos de Shell*
*Cidade Local Período*
*​*
*São Paulo 4Linux
<https://www.4linux.com.br/curso/programacao-em-shell-script> 05-09/12*
Dou treinamento de *Shell* em qualquer cidade.
Post by Rodrigo Ribeiro ***@gmail.com [shell-script]
Caros, boa noite,
Primeiramente muito obrigado pela ajuda!
Itamar,
nome_pacoteA x86_64 1.2.1-20
nome_pacoteB x86_64 1.2.1-20
nome_pacoteC x86_64 1.2.1-20
nome_pacoteD-xxx-base x86_64 1.0.1-45-1.2.1-20
nome_pacoteA12120
nome_pacoteB12120
nome_pacoteC12120
nome_pacoteD-xxx-base1014512120
A forma que o Julio me passou eu até consegui tirar os caracters com o
sed, porém não consegui concatenar com o nome dos pacotes da forma que
exemplifiquei acima.
Post by ***@yahoo.com.br [shell-script]
Caro Rodrigo
Veja se essa solução lhe atende.
Aqui eu listo o nome do pacote, a arquitetura e a versão separados por tab
echo '/repos/rpm/qa/centos6/x86_64/nome_pacoteA-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteB-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteC-1.2.1-20.x86_64.rpm
/repos/rpm/qa/centos6/x86_64/nome_pacoteD-xxx-base-1.0.1-45-1.2.1-20.x86_64.rpm' |
while read pacote
do
arq=$(basename $pacote)
arch=$(echo $arq | awk -F '.' '{print $(NF-1)}')
version=$(echo ${arq%.${arch}*} | grep -oE '[0-9.-]+$')
printf "%s\t%s\t%s\n" ${arq%${version}*} $arch ${version#-}
done
[]'s
Itamar
--
*Rodrigo Ribeiro*
Cel: 7984-9785
Continue reading on narkive:
Loading...