Removendo vários pacotes no Slackware de forma rápida

Publicado por Davidson Rodrigues Paulo em 09/11/2006

[ Hits: 11.037 ]

Blog: http://davidsonpaulo.com/

 


Removendo vários pacotes no Slackware de forma rápida



Usuários do Slackware sabem o quanto o utilitário removepkg é lento para remover pacotes instalados. Os motivos para isso são que, além de o utilitário ser escrito em Shell Script, ele faz testes e mais testes antes de começar a remover os arquivos, o que torna o processo seguro, porém muito lento.

Recentemente tentei atualizar o meu FreeRock GNOME 2.14 para o Dropline GNOME 2.16. A atualização demorou muito e, ao final, a instalação ficou quebrada. Não estava com tempo disponível para ficar tentando consertar as coisas, então resolvi remover todos os pacotes do GNOME e reinstalar o FreeRock, que estava funcionando perfeitamente.

O problema era que, somando-se os pacotes do FreeRock e do Dropline, dava um total de mais de 300 pacotes que precisavam ser removidos, o que iria demorar um dia inteiro caso eu usasse o removepkg, tempo que eu não tinha, pois precisava ter um desktop funcionando dentro de poucos minutos.

Assim desenvolvi uma solução alternativa de emergência (a popular gambiarra), que resolveu o meu problema e que apresento a vocês agora, por achar que pode vir a ser muito útil.

Crie um script chamado remove.sh com o seguinte conteúdo:

#!/bin/sh
# remove.sh
# Script para remover rapidamente pacotes no Slackware
#
# Autor: Davidson Paulo <davidsonpaulo@gmail.com>
# Uso: sh remove.sh [pacote] [ backup ]

# Testa se está tudo OK para o script ser executado

if [ "$PWD" != "/var/log/packages" ] ; then
  echo "Esse script precisa ser executado dentro de /var/log/packages"
  exit 1
fi

case $# in
  1)
    if [ ! -f $1 ] ; then
      echo "Erro: arquivo $1 não existe. Informe um arquivo válido"
      exit 3
    else
      BACKUP=0
    fi
    ;;
  2)
    if [ "$2" != "backup" ] ; then
      echo "Erro: parâmetro incorreto: $2"
      exit 4
    else
      BACKUP=1
    fi
    ;;
  *)
    echo "Uso: $0 [pacote] [ backup ]"
    exit 2
    ;;
esac

# Inicia a remoção do pacote
echo -ne "Removendo pacote $1...\t\t\t"

for FILE in `tail +17 $1|sort -r` ; do
  if [ -f /$FILE ] ; then
    # Faz o backup, se assim for solicitado
    if [ $BACKUP -eq 1 ] ; then
      tar uf /tmp/$1.tar /$FILE &> /dev/null
    fi  
    rm /$FILE
  elif [ -d /$FILE ] ; then
    if ! ls /$FILE > /dev/null ; then
      rmdir /$FILE
    fi
  fi
done

# Finaliza o backup, se assim tiver sido solicitado
if [ $BACKUP -eq 1 ] ; then
  # Salva o script de instalação
  mkdir /install
  mv /var/log/scripts/$1 /install/doinst.sh
  chmod 644 /install/doinst.sh
  # Salva o arquivo de descrição
  tail +6 $1 | head -n 11 > /install/slack-desc
  # Adiciona o diretório /install ao pacote .tar e
  # remove o diretório

  tar uf /tmp/$1.tar /install &> /dev/null
  rm -r /install
  # Compacta o pacote e renomeia-o para .tgz
  gzip -9 /tmp/$1.tar
  mv /tmp/$1{.tar.gz,.tgz}
fi

# Remove o arquivo com a lista de arquivos do pacote
rm $1


echo "[ OK ]"

Salve esse script no diretório /var/log/packages. Para remover um pacote, basta acessar o diretório e executar o script, passando como parâmetro o nome do pacote (deve existir um arquivo com esse nome dentro do diretório /var/log/packages):

# cd /var/log/packages
# sh remove.sh [pacote]


Para remover, por exemplo, o pacote gedit-2.14.3-i486-1frg, use:

# sh remove.sh gedit-2.14.3-i486-1frg

Você pode optar por fazer um backup do pacote, para que você possa reinstalá-lo caso algo dê errado. Para isso, basta adicionar a opção backup:

# sh remove.sh gedit-2.14.3-i486-1frg backup

Nesse exemplo, será feito um backup dos arquivos excluídos (incluído slack-desc e doinst.sh) em /tmp/gedit-2.14.3-i486-1frg..tgz. Case algo dê errado, você poderá reinstalar o pacote removido sem dificuldade:

# installpkg /tmp/gedit-2.14.3-i486-1frg.tgz

Se você fizer backup o processo de remoção vai demorar bem mais, mas ainda assim vai levar bem menos tempo que removepkg.

Se você quiser remover arquivos em lote, há vários meios. No meu caso, eu precisei remover todos os pacotes do FreeRock e do Dropline. Como os nomes desses pacotes terminavam em 'frg' e 'dl', respectivamente, bastou fazer assim:

# for PACOTE in *dl *frg ; do
sh remove.sh $PACOTE
done


Você pode criar um arquivo chamado 'lista', por exemplo, contendo os nomes dos pacotes que você quer remover, e então fazer assim:

# for PACOTE in `cat lista` ; do
sh remove.sh $PACOTE
done


Essa é uma boa alternativa para remover pacotes no Slackware, desde que não se tenha que fazer nenhuma verificação mais complexa ou se pretenda usar algum recurso avançado do removepkg.

Apenas para fins de alerta: esse script não possui qualquer tipo de garantia por parte do autor. Use-o por sua conta e risco. Ele está disponível sob a licença GNU GPL, então você é livre para copiá-lo, modificá-lo e distribuindo livremente, desde que respeite os termos da licença.

Espero que possa ser útil.

Grande abraço,

Davidson Paulo

Outras dicas deste autor

Criando backup tar multi-volume usando FIFO

Wireless RTL8187SE no Fedora 15

Usando variáveis para alterar arquivos com sed, *grep e outros

Instalando fontes do Android no Slackware/Zenwalk

Livro Squid, solução definitiva

Leitura recomendada

aBíblia Software 2.2: agora também em inglês

Habilitando Parallel Downloading do Pacman no ArchLinux

Alterando o idioma e o corretor ortográfico do WPS para o português do Brasil

Ksplice - Reboot pra quê?

FIGlet - Letras grandes no modo texto

  

Comentários
[1] Comentário enviado por riick em 09/11/2006 - 19:44h

Cara, otimo script...
removepkg é tenso mesmo, demora demais.


Abraço ae. x)

[2] Comentário enviado por removido em 10/11/2006 - 12:32h

Só podia ser coisa do Davidson mesmo.
A gente sente o cheiro de longe!!!
;-)



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts